Compare commits

...

144 Commits

Author SHA1 Message Date
PavelBARABANOV 8c99f0c166 Revert [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-18 21:01:17 +03:00
PavelBARABANOV 520e07e756 test 2025-11-17 17:45:36 +03:00
CamilleLaVey 674f552ff1 [vk, texture_cache] Workaround for games with wrong usage of R32 with float samplers 2025-11-15 19:41:26 -04:00
CamilleLaVey 75d9236520 [vk, pipeline_cache, texture_cache, qcom] Resolving textures and pipeline usage for QCOM 2025-11-15 19:18:00 -04:00
CamilleLaVey 89926bce0b [vk, spir-v] Adding emulation of Array 1D with 2D for Android 2025-11-15 18:54:53 -04:00
CamilleLaVey 6c1fc4b4ed [vk] Handling threading missuse of VkQueue 2025-11-15 18:30:31 -04:00
CamilleLaVey 311f06047b [vk, Maxwell] Refining support for HDR Formats based on Specs 2025-11-15 18:24:14 -04:00
CamilleLaVey 46df717f7c [vk] Degrade HDR Format to LDR 2025-11-15 16:12:44 -04:00
CamilleLaVey dcf9483b0b [vk, qcom] TEST: Adjustment to the MSAA and format resolve with native support 2025-11-15 15:06:43 -04:00
CamilleLaVey 2b828a9fee [vk] Re-adjusted HDR format handling based on physical specifications 2025-11-15 14:44:47 -04:00
CamilleLaVey 6fe1f86984 [vk, qcom] Revert Push Descriptors Threshold due to data corruption 2025-11-15 14:14:37 -04:00
CamilleLaVey af073f13cf [vk, qcom] Including Tile Properties and Store Ops based on QCOM specifications 2025-11-15 03:02:08 -04:00
CamilleLaVey aea945b671 [vk, host shaders, qcom] MSAA Handling by Native QCOM Shader Resolve 2025-11-15 01:47:28 -04:00
CamilleLaVey c52fda760a Merge branch 'stuffmadeforfun' of https://git.eden-emu.dev/eden-emu/eden into stuffmadeforfun 2025-11-14 23:40:23 -04:00
lizzie c168755c65 fix license 2025-11-15 03:38:33 +00:00
CamilleLaVey 8a83cf0271 [service, hle] Add defensive check in WriteBuffer 2025-11-15 03:37:57 +00:00
CamilleLaVey 3db41fbce6 [memory, vk] TEST: Tiled GPU optimization try #1 2025-11-15 03:37:56 +00:00
CamilleLaVey 5e7fb6eead Fix building issues 2025-11-15 03:37:56 +00:00
CamilleLaVey bcc5390943 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-15 03:37:44 +00:00
CamilleLaVey a51d875d91 [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-15 03:37:17 +00:00
PavelBARABANOV 6134a57367 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-15 03:37:01 +00:00
CamilleLaVey c845b6086f Adding missing headers 2025-11-15 03:37:01 +00:00
CamilleLaVey 31c168efe1 [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-15 03:36:25 +00:00
CamilleLaVey 8bd87204f5 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-15 03:36:09 +00:00
lizzie e72a206aee fix 2025-11-15 03:36:08 +00:00
CamilleLaVey 6a62fa7ee3 Implement handling for texture cache flickering 2025-11-15 03:36:01 +00:00
crueter 52b630dfdc build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-15 03:35:37 +00:00
CamilleLaVey 4860050358 attempt to fix building issues 2025-11-15 03:35:37 +00:00
CamilleLaVey 47f0563c1b Giving maintance to driver features and unused extensions 2025-11-15 03:35:35 +00:00
CamilleLaVey b1208f03ee Fix building issues 2025-11-15 03:33:30 +00:00
CamilleLaVey 0fd603c094 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-15 03:33:30 +00:00
CamilleLaVey 1ca19af7fb [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-15 03:33:30 +00:00
PavelBARABANOV ddd78c3b37 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-15 03:33:30 +00:00
CamilleLaVey 2e68f8795d Adding missing headers 2025-11-15 03:33:28 +00:00
CamilleLaVey d3595fd2b1 [gl, vk, texture cache] Attempt to get correct MSAA image upload and download 2025-11-15 03:33:28 +00:00
CamilleLaVey 033531509b [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-15 03:33:28 +00:00
CamilleLaVey b9954de1ca Fixing missing headers 2025-11-15 03:33:28 +00:00
CamilleLaVey 5f88deeebf [gl. vk] Extending impl for atomic floats operations 2025-11-15 03:33:28 +00:00
CamilleLaVey d25da944ed Changing checks in HostMemor for virtual memory mapping 2025-11-15 03:33:27 +00:00
CamilleLaVey ec274a855e TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-15 03:33:27 +00:00
CamilleLaVey 8133d4a8b4 Improved handling for Custom Border Color buggy impl on ARM/ QCOM and Turnip 2025-11-15 03:33:27 +00:00
lizzie 4f3e4bf9cb fix 2025-11-15 03:33:27 +00:00
CamilleLaVey ec9e0f37ea Implement handling for texture cache flickering 2025-11-15 03:33:27 +00:00
crueter b5f7735dba build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-15 03:33:27 +00:00
CamilleLaVey 5f501d6ec0 attempt to fix building issues 2025-11-15 03:33:27 +00:00
CamilleLaVey e820f304a5 Giving maintance to driver features and unused extensions 2025-11-15 03:33:26 +00:00
CamilleLaVey 3527a33430 [service, hle] Add defensive check in WriteBuffer 2025-11-14 20:31:14 -04:00
Shinmegumi 3f226678dd [vk] Fix fallback viewport/scissor origin handling (#294)
When viewport_scale_offset_enabled is disabled, the fallback path
previously assumed a top-left origin for both viewport and scissor.
This caused incorrect positioning or inverted geometry when the GPU
state expected a lower-left origin.

This change:
- Adjusts viewport setup: if window_origin is lower-left, shift Y and
  flip height negative to emulate lower-left in Vulkan’s top-left space.
- Updates scissor setup: recalculates Y for lower-left origin and
  ensures width/height fall back to 1 if zero, avoiding invalid extents.

This aligns Vulkan’s viewport/scissor behavior with Maxwell state,
fixing rendering issues in paths without scale/offset enabled.

Co-authored-by: MaranBr <maranbr@outlook.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/294
Co-authored-by: Shinmegumi <shinmegumi@eden-emu.dev>
Co-committed-by: Shinmegumi <shinmegumi@eden-emu.dev>
2025-11-14 15:13:29 +01:00
lizzie e9d84d098d [dynarmic] attempt fix totk regression from #358 (#3013)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3013
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-14 15:07:13 +01:00
CamilleLaVey ee5565077c [memory, vk] TEST: Tiled GPU optimization try #1 2025-11-14 01:32:02 -04:00
CamilleLaVey 9085ff1229 Merge branch 'stuffmadeforfun' of https://git.eden-emu.dev/eden-emu/eden into stuffmadeforfun 2025-11-13 23:10:40 -04:00
CamilleLaVey 6eff1779a2 Fix building issues 2025-11-14 03:03:28 +01:00
CamilleLaVey 3228cffd23 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-14 03:03:28 +01:00
CamilleLaVey 9d9530efe0 [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-14 03:03:28 +01:00
PavelBARABANOV aaaa7c7601 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-14 03:03:28 +01:00
CamilleLaVey 7f8a507b79 Adding missing headers 2025-11-14 03:03:28 +01:00
CamilleLaVey c28ae059e8 [gl, vk, texture cache] Attempt to get correct MSAA image upload and download 2025-11-14 03:03:28 +01:00
CamilleLaVey 7f1369f9a8 [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-14 03:03:28 +01:00
CamilleLaVey 6b05c164a1 Fixing missing headers 2025-11-14 03:03:28 +01:00
CamilleLaVey a3f9d3b59c [gl. vk] Extending impl for atomic floats operations 2025-11-14 03:03:28 +01:00
CamilleLaVey b066a6ffa0 Changing checks in HostMemor for virtual memory mapping 2025-11-14 03:03:28 +01:00
CamilleLaVey a14cba7f11 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-14 03:03:28 +01:00
CamilleLaVey 2d85b70373 Improved handling for Custom Border Color buggy impl on ARM/ QCOM and Turnip 2025-11-14 03:03:28 +01:00
lizzie aa8cc4da38 fix 2025-11-14 03:03:28 +01:00
CamilleLaVey baddaf0040 Implement handling for texture cache flickering 2025-11-14 03:03:28 +01:00
crueter 35b4e34e09 build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-14 03:03:28 +01:00
CamilleLaVey b574e9c334 attempt to fix building issues 2025-11-14 03:03:28 +01:00
CamilleLaVey d6b5a3e181 Giving maintance to driver features and unused extensions 2025-11-14 03:03:28 +01:00
CamilleLaVey a65a35432e Fix building issues 2025-11-13 21:30:19 -04:00
CamilleLaVey 6e575364eb [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-13 20:37:47 -04:00
CamilleLaVey 71a1442ab6 [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-13 18:42:49 -04:00
xbzk 32db6c1877 [renderer] NG ragebound workaround via LoadOverrides + vk_rasterizer UpdateBlending TouchBlendequations Rework (#2934)
this pull should impact ninja gaiden ragebound only! it makes it playable past stage 4-1.
it contains a workaround for missing maxwell_3d's iterated_blend functionality, which fixes several graphics all over the game.
the issue causes transparency enabled blends (mostly lighting fx) to be wrongly blended into destination, turning textures into black frames.
in stage 4-1 there are lighthing layers in the foreground, causing sprites layer to become overlapped by these opaque black frames, including entire screen in a mid boss fight, making it unplayable* (players maneuvered by turning immortal option on and swinging sword all around until defeating it).
also only in stage 4-1 the fix has a short drawback: when you buff up next attack these problematique blends will be drawn back as black frames, but only for a split second, so no big deal.
this workaround was already discovered and available in PR 302,  but in an unconventional way for a game specific override, so we did forbidden it. now it uses classic game specific override solution exampled in core.cpp's System::Impl::LoadOverrides method, so now i guess it's worth to merge it and deliver this to players until we harness iterated_blend control.

additionally I've slightly reworked vk_rasterizer.cpp's RasterizerVulkan::UpdateBlending, if (state_tracker.TouchBlendEquations()) {...} session.
it was made in a way that for a single blend, it exhaustly calls 48 (6 x 8) MaxwellToVK redundant functions, and declared a lambda function inside a 8 laps loop.
reworked it so that instead of 48 calls it makes only the necessary 6 calls, and then merely safely copy the result for the other 7 times.

Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2934
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-13 14:01:32 +01:00
lizzie 8eaa7c28ce [common] provide fallback for lack of atomic u128 support (#2999)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2999
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 13:27:32 +01:00
lizzie 3edfcabdea [dist] small low-fi version of the icon w/o antialias artifacts (#3006)
This version of the icon is mainly so the main one doesn't look like it has been compressed like a JPEG when shown on the taskbar :)
Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3006
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 13:27:03 +01:00
lizzie 450c483de0 [cmake, externals/ffmpeg]: fix Solaris and BSD* builds with troubling makes (#3014)
Partial backport of https://github.com/pflyly/eden-nightly/blob/main/patches/solaris.patch

Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3014
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 13:26:40 +01:00
lizzie 66db2613b5 [common] fix formatting of swapped u32_le/u64_le for BE targets (#2998)
Fixes a bunch of errors :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2998
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 13:23:46 +01:00
lizzie 9a046190c7 [shader_recompiler] macro-ify flow_test and attribute (#2900)
Of course - macros my beloved :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2900
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 13:22:02 +01:00
kleidis cfbef5c487 [android] Setting to manually set app language (#2951)
It is on the app settings section

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2951
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: kleidis <kleidis1@protonmail.com>
Co-committed-by: kleidis <kleidis1@protonmail.com>
2025-11-13 03:45:58 +01:00
kleidis f51d61e4a4 [android] Use spinbox setting type for CPU_TICKS (#2952)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2952
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: kleidis <kleidis1@protonmail.com>
Co-committed-by: kleidis <kleidis1@protonmail.com>
2025-11-13 03:45:41 +01:00
lizzie ba9e03a612 [shared_recompiler/maxwell] fix SURED() wrong encodings (#2983)
SURED does NOT have a binding register and stuff, it is strictly just a binding-offset * 4

Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2983
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-13 03:40:29 +01:00
crueter 7832afc5dd [externals] update nx-tzdb to 121125 (#3011)
real gzipped archive

Signed-off-by: crueter <crueter@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3011
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-13 03:25:55 +01:00
Caio Oliveira 028765867f externals: Fix Debug builds and remove PCH leftover (#3000)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3000
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-committed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-13 03:20:38 +01:00
MaranBr d89df63a28 [video_core] Clean up the code and fix some inconsistences (#3015)
This cleans up the code and fixes some inconsistencies in the EDS settings.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3015
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-13 03:04:00 +01:00
crueter 87c4f658ce [ci] tx update ci (#3008)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3008
2025-11-12 05:21:49 +01:00
crueter b7584cb2c3 [ci] push sources on every master push (#3007)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3007
2025-11-12 04:38:32 +01:00
crueter f32f356c40 [desktop] always include common/detached_tasks.h (#3002)
Co-authored-by: Pabel Sobolev <contact@paveloom.dev>
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3002
2025-11-11 07:44:14 +01:00
crueter 7ca657d22f [cmake] allow static MinGW/macOS builds; fix clangarm64 (#2994)
Requires qt6-static, obviously... at least for eden. eden-cli also can
be built fully static
Notable challenges n such:
1. VkMemAlloc conflicts with Qt, since it embeds vk_mem_alloc.h in
   qrhivulkan; we can get around this by conditionally defining
   VMA_IMPLEMENTATION; that is, define it in the SDL2 frontend and undef
   it in the Qt frontend. It's not ideal, but I mean... it works, no?
2. find_library, pkgconfig, and some Config modules will always look for
   a .dll, so we have to tell CMake to look for .a
3. In spite of this, some will end up using .dll.a (implib) as their
   link targets; this is, well, bad, so we create a find_library hook
   that rejects dll.a
4. Some libraries have specific configs (boost lol)
5. Some libraries use _static targets (zstd, mbedtls)
6. Some extra libraries need to be linked, i.e. jbig, lzma, etc
7. QuaZip is sad

Needs testing on all platforms, and for both frontends on desktop, to
ensure Vulkan still works as expected.

(also: CI). Resulting executables are:
- 71MB for eden.exe
- 39MB for eden-cli.exe

Considering the entire libicudt is included (thanks Qt), that's a great size all things considered. No need to bundle all those plugins and translation files too.

Theoretically, this lays the groundwork towards fully static executables for other platforms too; though Linux doesn't have a huge benefit since AppImages are needed regardless. eden-room though maybe?

Fixes comp for clangarm64 because -msse4.1

Also allows macOS to build with qt6-static. macOS can't build static executables, but with these changes it ONLY relies on system libraries like libc and frameworks. So in theory we don't even need macdeployqt.

Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2994
2025-11-11 06:22:33 +01:00
MaranBr 7764cdd57e [am] Improve some error messages (#2996)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2996
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-10 23:32:50 +01:00
PavelBARABANOV 4a17762ed7 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-10 18:52:31 +03:00
CamilleLaVey 447c4de73d Adding missing headers 2025-11-10 00:27:38 -04:00
CamilleLaVey cd2c4d8caf [gl, vk, texture cache] Attempt to get correct MSAA image upload and download 2025-11-10 00:22:08 -04:00
CamilleLaVey ee64c945fb [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-09 23:14:51 -04:00
CamilleLaVey eec5d48220 Fixing missing headers 2025-11-09 20:03:19 -04:00
CamilleLaVey 75cc43a57a [gl. vk] Extending impl for atomic floats operations 2025-11-10 00:55:57 +01:00
CamilleLaVey 0078094b86 Changing checks in HostMemor for virtual memory mapping 2025-11-10 00:55:57 +01:00
CamilleLaVey 3cd33fce44 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-10 00:55:57 +01:00
CamilleLaVey ccafe0ed91 Improved handling for Custom Border Color buggy impl on ARM/ QCOM and Turnip 2025-11-10 00:55:57 +01:00
lizzie 94af9ff51f fix 2025-11-10 00:55:57 +01:00
CamilleLaVey d229fdca32 Implement handling for texture cache flickering 2025-11-10 00:55:57 +01:00
crueter e636e940ed build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-10 00:55:57 +01:00
CamilleLaVey 2798174b00 attempt to fix building issues 2025-11-10 00:55:57 +01:00
CamilleLaVey 46f2084114 Giving maintance to driver features and unused extensions 2025-11-10 00:55:57 +01:00
PavelBARABANOV 42863027e2 Revert "[core/memory] Remove defered heap allocation on Linux." (#2974)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2974
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: PavelBARABANOV <pavelbarabanov94@gmail.com>
Co-committed-by: PavelBARABANOV <pavelbarabanov94@gmail.com>
2025-11-09 22:42:09 +01:00
crueter 08f3639c80 [desktop, fs] main_window separation; fix Ryujinx save data link issues (#2929)
Some genius decided to put the entire MainWindow class into main.h and
main.cpp, which is not only horrific practice but also completely
destroys clangd beyond repair. Please, just don't do this.

(this will probably merge conflict to hell and back)

Also, fixes a bunch of issues with Ryujinx save data link:
- Paths with spaces would cause mklink to fail
- Add support for portable directories
- Symlink detection was incorrect sometimes(????)
- Some other stuff I'm forgetting

Furthermore, when selecting "From Eden" and attempting to save in Ryujinx, Ryujinx would destroy the link for... some reason? So to get around this we just copy the Eden data to Ryujinx then treat it like a "From Ryujinx" op

Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2929
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
2025-11-09 18:07:38 +01:00
Bix e13c7ef3f8 [dist] Switch back to default Eden logo (#2990)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2990
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: Bix <bix@bixed.xyz>
Co-committed-by: Bix <bix@bixed.xyz>
2025-11-08 23:16:50 +01:00
unknown 89dd133a2f [frontend] Remove QDockWidget Wait Tree (#2949)
No one uses it and knows how to use it. So, remove it and replace it later with something more useful :)

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2949
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: unknown <sahyno1996@gmail.com>
Co-committed-by: unknown <sahyno1996@gmail.com>
2025-11-08 22:16:30 +01:00
John 86e9c32800 [desktop] Save option location in the Data Manager tool fix (#2986)
The first attempt missed a few files and did not move it properly.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2986
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: John <john@eden-emu.dev>
Co-committed-by: John <john@eden-emu.dev>
2025-11-08 19:41:35 +01:00
lizzie f1cf30bc2a [dynarmic] fix build error for dynarmic_tests_generator on aarch64 (#2978)
Signed-off-by: lizzie lizzie@eden-emu.dev
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2978
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-08 18:47:55 +01:00
John 5af5214451 [desktop] Move save option location in the Data Manager tool. (#2985)
Move the save option further away from the shader option to help alleviate users accidents when deleting data.

(I slipped and I accidentally deleted all my saves instead of shaders when testing so many builds)

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2985
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: John <john@eden-emu.dev>
Co-committed-by: John <john@eden-emu.dev>
2025-11-08 18:46:30 +01:00
lizzie 312c1cc0f6 [shader_recompiler] Simplify translate loop and directly call (the now uniform functions); remove repetitive declarations on impl.h (#2972)
Function polymorphism where it wasn't needed? especially on tight code loops like translating code and whatnot?
You may think the compiler was fine with this but nah, it just made codegen for all those paths; I didn't check LTO but I'd assume it behaves the same (since the "black box" from most walkers suck) - basically bunch of code that isn't longer used
Also uniformly declaring all functions (i.e same args, return value) makes the entire switch statment way nicer

Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2972
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-08 04:55:03 +01:00
MaranBr 576c4e5f77 [audio_core] Fix audio reverb effect acording to specs (#2976)
This fixes the audio reverb issue acording to specs. Known for affecting The Legend of Zelda: Echoes of Wisdom.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2976
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-08 03:50:51 +01:00
lizzie 84cf3e8c84 [nce] remove software prefetching instances (#2857)
May be a complete hit or miss on performance with NCE
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2857
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-08 00:42:10 +01:00
lizzie 45a2008aa6 [common] replace Common::(DerivedFrom, IsArithmetic, Size, ConvertibleTo, IsIntegral) with libstdc++ equivalents (#290)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/290
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-07 17:03:01 +01:00
lizzie 8f6e0aa2cb [tools, hle/kernel] generate condensed version of svc.cpp; move svc_generator.py and generate_converters.py to tools (#2791)
Eventually we'd want cmake to do the build for us (as a build step) instead of having git be polluted with commits to update the autogenerated file...

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2791
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-07 17:00:53 +01:00
lizzie ca0bc65531 [cmake] fix compilation for Intel Atom N455 (#2872)
Patience is key when building from source on an Intel Atom N455.

Of course, no SSE4.1 is in an atom... which is so unfortunate :(
We only get SSSE3 - but CI handles for building better codegen doesn't it?

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2872
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: crueter <crueter@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-07 16:58:41 +01:00
lizzie a1930d1063 [dynarmic] remove MCL_ARCHITECTURE macros; fix unreachable macro builtin (#2889)
Eventually we shall use std::unreachable() ONCE all platforms support it :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2889
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-07 16:50:14 +01:00
lizzie 48843306e2 [compat] Fix other DragonFlyBSD/NixOS issues (#2860)
Uh - the other pr that had "Fix dragonfly" got commits lost and I didn't notice... oops; cherry picked them back through :)
Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2860
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-07 16:50:03 +01:00
Caio Oliveira 159482a7a9 Revert "[vk] Clean up Extended Dynamic State code" (#2970)
* this PR need more work (as it break Eden on Windows+AMD)

Signed-off-by: Caio Oliveira <caiooliveirafarias0@gmail.com>

---

Revert "[vk] Add back VIDS but disable on EDS0 (#2957)"

This reverts commit 1c4dae066b.

Revert "[vk] disable VK_EXT_vertex_input_dynamic_state again (#2954)"

This reverts commit 9406438d51.

Revert "[vk] Clean up Extended Dynamic State code (#2947)"

This reverts commit 612da00d1b.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2970
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-committed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-07 14:01:28 +01:00
MaranBr 0510f0bdbc [audio_core] Increase RingBuffer and SinkBuffer size a bit more (#2964)
This helps weaker CPUs maintain consistent audio playback while keeping latency low.

Complement to #2944.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2964
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-07 01:42:57 +01:00
MaranBr 569dbfe8c0 [video_core] Increase MAX_MIP_LEVELS to 16 according to specs (#2965)
This increases MAX_MIP_LEVELS from 14 to 16, according to specs.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2965
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-07 01:42:52 +01:00
lizzie 8412e64bb0 [dynarmic] fix qlaunch (#2967)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2967
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-06 22:37:52 +01:00
JPikachu 1c4dae066b [vk] Add back VIDS but disable on EDS0 (#2957)
Should fix regressions from removing it while also fixing black screen with it enabled

Co-authored-by: JPikachu <jpikachu.eden@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2957
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Co-authored-by: JPikachu <jpikachu@eden-emu.dev>
Co-committed-by: JPikachu <jpikachu@eden-emu.dev>
2025-11-05 21:25:23 +01:00
crueter 9406438d51 [vk] disable VK_EXT_vertex_input_dynamic_state again (#2954)
DO NOT REMOVE THIS! EVER! EVEN IF MESA CLAIMS TO FIX IT!

A few months ago, Aleksandr and I did extensive testing on a 6600 and
6950XT and were able to confirm that VK_EXT_vertex_input_dynamic_state
is indeed broken beyond repair on RADV. MESA has claimed multiple times
to fix this, yet it's never budged once (average GitLab users)

Most games literally do not work without this. DO. NOT. REMOVE.
EVER!

Signed-off-by: crueter <crueter@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2954
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-05 05:46:23 +01:00
JPikachu 612da00d1b [vk] Clean up Extended Dynamic State code (#2947)
- Removed forced dynamic state 0 logic
- Restore and update the removal of broken states on certain drivers
- Inside 'vk_rasterizer.cpp' make 'UpdateDynamicStates' only check device
   capabilities directly instead of relying on user settings.
- Add a 'Force Unsupported Extensions' toggle that:
   "Bypasses all driver workarounds and safety checks.
     May cause crashes, graphical glitches, or instability.
     Only enable for testing purposes."

Cleans up EDS logic and adds new 'Force Unsupported Extensions' toggle,
Fixes vertex explosions in 'Pokemon: Legends ZA' when EDS is set to 0.

Co-authored-by: JPikachu <jpikachu.eden@gmail.com>
Co-authored-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2947
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Co-authored-by: JPikachu <jpikachu@eden-emu.dev>
Co-committed-by: JPikachu <jpikachu@eden-emu.dev>
2025-11-05 02:20:09 +01:00
JPikachu 4b34a5c9fa [am] Stub ReleaseSleepLock and ReleaseSleepLockTransiently (#2902)
Should fix some things in Super Mario Odyssey
Co-authored-by: lizzie <lizzie@eden-emu.dev>

Co-authored-by: JPikachu <jpikachu.eden@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2902
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: JPikachu <jpikachu@eden-emu.dev>
Co-committed-by: JPikachu <jpikachu@eden-emu.dev>
2025-11-04 22:36:51 +01:00
lizzie 504df4856d [core/loader] Implement a bit improper ASLR (#2945)
A bit improper of an ASLR - it does something but something good? Who knows...
All I know is that there is a non-uniform distrobution for rand() and that rng_seed is likely a better solution?
I don't know

Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2945
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-04 22:35:34 +01:00
xbzk 6abaee94a6 fix for the rotate -> unpause bug (#2938)
Some lore:
On Android, whenever you pause emulation, next you will a lot likely move your phone, and then proly cause a rotation.
Unpause upon rotation makes me unpause my games accidentally very often.
I acknowledge that as a bug, and believe most will agree.

Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2938
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-04 16:59:06 +01:00
crueter 4bf2e0a7aa [dynarmic] Add a formatter for Dynarmic::IR::Opcode (#2948)
https://github.com/gentoo/guru/blob/fa6dcae7027e4c4d5b71fadcfa7dc01af8ff2358/games-emulation/eden/files/eden-0.0.4_rc1-add-a-formatter-for-Dynarmic-IR-Opcode.patch

Co-authored-by: Pavel Sobolev <contact@paveloom.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2948
2025-11-04 08:42:35 +01:00
crueter 82a476d458 [cmake] ffmpeg: use static on MSVC (#2946)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2946
2025-11-04 07:05:52 +01:00
MaranBr ac2287f261 [audio_core] Slightly increase audio latency (#2944)
This slightly increases audio latency to prevent audio skipping in some games, such as Super Mario Odyssey when playing videos.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2944
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Co-authored-by: MaranBr <maranbr@outlook.com>
Co-committed-by: MaranBr <maranbr@outlook.com>
2025-11-04 00:23:03 +01:00
lizzie dd24ef244d [dynarmic] fix assert for referencing a non-initialized part of the boost::stable_vector container (#2940)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2940
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 21:09:14 +01:00
lizzie 5cc218084b [cmake] account for sysroot when cross compiling for SunOS/FBSD/etc; dynarmic now uses ARCHITECTURE_* from global defs (#2928)
fixes when cross compiling for fbsd/openbsd

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2928
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 21:08:48 +01:00
lizzie c0663ccd6b [core/arm] more verbose backtrace showing ALL of the thread's context state (#2924)
Should make backtraces infinitely better :)

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2924
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 21:08:02 +01:00
lizzie 8a7fe32a2c [common] Do not expose platform specific Crash() macro that is only used ever once (#2909)
thing is only ever used once and its also platform specific... uh

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2909
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 21:07:30 +01:00
lizzie 4b0bcfb0f7 [compat] Windows 8.1 support (#2772)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2772
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: crueter <crueter@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 21:06:51 +01:00
lizzie 82eb5a03f4 [core/arm] introduce vtable bouncing (#2943)
Basically this just makes functions that go into zero-page or invalid addresses "bounce" back (with a return err of 0) such that it emulates a subroutine returning appropriatedly... this is mainly inspired by [this particular commit](https://git.citron-emu.org/Citron/Emulator/commit/fbb4f5c015d778ed0c8e2d91b01dcdffd7da9681); with the key difference of accounting for the scheduler fucking up some random bs.

I don't like this hack but anyways maybe it fixes something?

Signed-off-by: lizzie lizzie@eden-emu.dev

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2943
Reviewed-by: Maufeat <sahyno1996@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 20:36:38 +01:00
lizzie 0e6ea2d9d6 [shader_recompiler] Add IAbs64 to prevent errors when using I2F with a 64-bit packed CBUF variant (#2918)
- Using I2F cbuf variant (packed 32x2 aka. U64)
- Code will call IAbs() if some conditions are met (signed + abs bit)
- Uh oh we don't have a variant for 64 bits!
- Fuck now we just made BAD ir code :(

Signed-off-by: lizzie <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2918
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-03 20:20:19 +01:00
crueter 6a9ad5e1ea [docs] full Gentoo caveats/deps (#2939)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2939
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-02 23:56:25 +01:00
Caio Oliveira 903106c9b2 [audio_core] Decrease wait_for a little bit (#2937)
This fixes an audio problem on Steam Deck.

Signed-off-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: MaranBr <maranbr@outlook.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2937
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-committed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
2025-11-02 22:44:17 +01:00
crueter c70abc8e43 [cmake, docs] msys: allow bundled FFmpeg, update dep/caveat docs, faster linking on Release mode (#2921)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2921
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-11-02 08:15:48 +01:00
crueter 8ae7974092 [ssl] fix bundled OpenSSL ca cert issue (#2932)
I believe this is the final battle with OpenSSL

Signed-off-by: crueter <crueter@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2932
Reviewed-by: Maufeat <sahyno1996@gmail.com>
2025-11-02 04:01:48 +01:00
crueter def4349e7a [dist, android] update translations from Transifex (#2917)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2917
2025-11-01 07:25:28 +01:00
lizzie fe6b6fbde5 [shader_recompiler] simplify decoder table logic and let compiler do tables for us (#2915)
The compiler is very smart, I trust the compiler to make a proper decoder selector rather than rolling our own.

Probably mostly benefitted on PGO builds.

Directly affects cache recompilation times (test with pipeline shaders OFF to force shaders to rebuild :)

Also restores CCTLT so we have the full ISA (or do we? Is ISBEWR missing? - someone should run fuzzing :)

Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2915
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Co-committed-by: lizzie <lizzie@eden-emu.dev>
2025-11-01 03:57:28 +01:00
JPikachu ea6c3c379c [cmake] Re-enable cubeb for FreeBSD (#2916)
Co-authored-by: JPikachu <jpikachu.eden@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2916
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Co-authored-by: JPikachu <jpikachu@eden-emu.dev>
Co-committed-by: JPikachu <jpikachu@eden-emu.dev>
2025-11-01 03:49:08 +01:00
276 changed files with 20619 additions and 19538 deletions
+19
View File
@@ -0,0 +1,19 @@
name: tx-src
on:
push:
branches: [ master ]
jobs:
sources:
runs-on: source
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Push New Sources
run: |
export PATH=/usr/lib/qt6/bin:$PATH
./tools/translations/qt-source.sh
tx-cli push -s
+61
View File
@@ -0,0 +1,61 @@
name: tx-pull
on:
# monday, wednesday, saturday at 2pm
schedule:
cron:
- '0 14 * * 1,3,6'
jobs:
tx-update:
runs-on: source
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get New Translations
run: tx-cli pull -t -f
- name: Push branch
run: |
git config --local user.name "Eden CI"
git config --local user.email "ci@eden-emu.dev"
git config --local user.signingkey "D57652791BB25D2A"
git config --local push.autoSetupRemote true
git remote set-url origin ci:eden-emu/eden.git
TIMESTAMP=$(date +"%s")
echo "TIMESTAMP=$TIMESTAMP" >> "$GITHUB_ENV"
git switch -c update-translations-$TIMESTAMP
git add dist src/android/app/src/main/res
git commit -sS -m "[dist, android] Update translations from Transifex"
git push
- name: Create PR
run: |
DATE=$(date +"%b %d")
TITLE="[dist, android] Update translations from Transifex for $DATE"
BODY="Automatic translation update for $DATE"
BASE=master
HEAD=update-translations-$TIMESTAMP
cat << EOF > data.json
{
"base": "$BASE",
"body": "$BODY",
"head": "$HEAD",
"title": "$TITLE"
}
EOF
curl -X 'POST' \
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
-H 'accept: application/json' \
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
-H 'Content-Type: application/json' \
-d "@data.json" --fail
+195 -37
View File
@@ -13,12 +13,19 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
set(PLATFORM_OPENBSD ON)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "NetBSD")
set(PLATFORM_NETBSD ON)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "DragonFly")
set(PLATFORM_DRAGONFLYBSD ON)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Haiku")
set(PLATFORM_HAIKU ON)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(PLATFORM_LINUX ON)
endif()
# dumb heuristic to detect msys2
if (CMAKE_COMMAND MATCHES "msys64")
set(PLATFORM_MSYS ON)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CXX_CLANG ON)
if (MSVC)
@@ -37,17 +44,23 @@ endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/11112
# This works totally fine on MinGW64, but not CLANG{,ARM}64
if(MINGW AND CXX_CLANG)
set(CMAKE_SYSTEM_VERSION 10.0.0)
endif()
# NB: this does not account for SPARC
# If you get Eden working on SPARC, please shoot crueter@crueter.xyz multiple emails
# and you will be hailed for eternity
if (PLATFORM_SUN)
# Terrific Solaris pkg shenanigans
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
list(APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake")
# Amazing - absolutely incredible
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/amd64/cmake")
list(APPEND CMAKE_MODULE_PATH "/usr/lib/amd64/cmake")
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake")
# For some mighty reason, doing a normal release build sometimes may not trigger
# the proper -O3 switch to materialize
@@ -63,18 +76,101 @@ endif()
# Needed for FFmpeg w/ VAAPI and DRM
if (PLATFORM_OPENBSD)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/X11R6/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/X11R6/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/X11R6/lib")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib")
elseif (PLATFORM_NETBSD)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/X11R7/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/X11R7/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/X11R7/lib")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib")
endif()
# NetBSD: Fun for the whole family!
if (PLATFORM_NETBSD)
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:/usr/pkg/lib/ffmpeg7/pkgconfig")
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig")
endif()
# MSYS2 utilities
if (PLATFORM_MSYS)
include(FixMsysPaths)
# really, really dumb heuristic to detect what environment we are in
macro(system var)
if (CMAKE_COMMAND MATCHES ${var})
set(MSYSTEM ${var})
endif()
endmacro()
system(mingw64)
system(clang64)
system(clangarm64)
system(ucrt64)
if (NOT DEFINED MSYSTEM)
set(MSYSTEM msys2)
endif()
# we (generally) want to prioritize environment-specific binaries if possible
# some, like autoconf, are not present on environments besides msys2 though
set(CMAKE_PROGRAM_PATH C:/msys64/${MSYSTEM}/bin C:/msys64/usr/bin)
set(ENV{PKG_CONFIG_PATH} C:/msys64/${MSYSTEM}/lib/pkgconfig)
endif()
# static stuff
option(YUZU_STATIC_BUILD "Use static libraries and executables if available" OFF)
if (YUZU_STATIC_BUILD)
# lol
set(Boost_USE_STATIC_LIBS ON)
set(BUILD_SHARED_LIBS OFF)
## find .a libs first (static, usually)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
## some libraries define a Library::Name_static alternative ##
set(YUZU_STATIC_SUFFIX _static)
## some libraries use CMAKE_IMPORT_LIBRARY_SUFFIX e.g. Harfbuzz ##
set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
if (MINGW)
# simple hook to reject dynamic libs
function(find_library var)
# also skip previously-found libraries cuz... yaknow
if (${var})
return()
endif()
_find_library(${var} ${ARGN})
if (${var})
get_filename_component(lib_name "${${var}}" NAME)
if (lib_name MATCHES "dll\\.a$")
unset(${var} CACHE)
set(${var} "${var}-NOTFOUND" CACHE INTERNAL "" FORCE)
endif()
endif()
endfunction()
# msys2 quazip does not build a static lib
set(QuaZip-Qt6_FORCE_BUNDLED ON)
set(YUZU_USE_BUNDLED_FFMPEG ON)
set(YUZU_USE_BUNDLED_SDL2 ON)
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
elseif(APPLE)
# these libs do not properly provide static libs/let you do it with cmake
set(YUZU_USE_CPM ON)
# IMPORTED_IMPLIB not set for imported target
# TODO(crueter): wtf
set(YUZU_USE_BUNDLED_FFMPEG ON)
set(YUZU_USE_EXTERNAL_SDL2 ON)
set(fmt_FORCE_BUNDLED ON)
set(SPIRV-Tools_FORCE_BUNDLED ON)
set(SPIRV-Headers_FORCE_BUNDLED ON)
set(zstd_FORCE_BUNDLED ON)
endif()
endif()
# Detect current compilation architecture and create standard definitions
@@ -92,12 +188,14 @@ function(detect_architecture symbol arch)
if (ARCHITECTURE_${arch})
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
add_definitions(-DARCHITECTURE_${arch}=1)
add_definitions("-DARCHITECTURE_${arch}=1")
endif()
endif()
endfunction()
if (NOT ENABLE_GENERIC)
# https://sourceforge.net/p/predef/wiki/Architectures/
# TODO: THIS IS FUCKING FLAWED ONLY THE FIRST SYMBOL THAT APPEARS WILL BE CONSIDERED :(
if (MSVC)
detect_architecture("_M_AMD64" x86_64)
detect_architecture("_M_IX86" x86)
@@ -109,6 +207,48 @@ if (NOT ENABLE_GENERIC)
detect_architecture("__arm__" arm)
detect_architecture("__aarch64__" arm64)
endif()
detect_architecture("__ARM64__" arm64)
detect_architecture("__aarch64__" arm64)
detect_architecture("_M_ARM64" arm64)
detect_architecture("__arm__" arm)
detect_architecture("__TARGET_ARCH_ARM" arm)
detect_architecture("_M_ARM" arm)
detect_architecture("__x86_64" x86_64)
detect_architecture("__x86_64__" x86_64)
detect_architecture("__amd64" x86_64)
detect_architecture("_M_X64" x86_64)
detect_architecture("__i386" x86)
detect_architecture("__i386__" x86)
detect_architecture("_M_IX86" x86)
detect_architecture("__ia64" ia64)
detect_architecture("__ia64__" ia64)
detect_architecture("_M_IA64" ia64)
detect_architecture("__mips" mips)
detect_architecture("__mips__" mips)
detect_architecture("_M_MRX000" mips)
detect_architecture("__powerpc64__" ppc64)
detect_architecture("__ppc64__" ppc64)
detect_architecture("__PPC64__" ppc64)
detect_architecture("_ARCH_PPC64" ppc64)
detect_architecture("__ppc__" ppc)
detect_architecture("__ppc" ppc)
detect_architecture("__powerpc__" ppc)
detect_architecture("_ARCH_COM" ppc)
detect_architecture("_ARCH_PWR" ppc)
detect_architecture("_ARCH_PPC" ppc)
detect_architecture("_M_MPPC" ppc)
detect_architecture("_M_PPC" ppc)
detect_architecture("__riscv" riscv)
detect_architecture("__EMSCRIPTEN__" wasm)
endif()
if (NOT DEFINED ARCHITECTURE)
@@ -139,9 +279,9 @@ if (CXX_CLANG_CL)
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc> # thanks microsoft
)
# REQUIRED CPU features IN Windows-amd64
if (ARCHITECTURE_x86_64)
add_compile_options(
# Required CPU features for amd64
$<$<COMPILE_LANGUAGE:C,CXX>:-msse4.1>
$<$<COMPILE_LANGUAGE:C,CXX>:-mcx16>
)
@@ -159,20 +299,17 @@ if (MSVC AND NOT CXX_CLANG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-")
endif()
if (PLATFORM_FREEBSD)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")
if (PLATFORM_FREEBSD OR PLATFORM_DRAGONFLYBSD)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/local/lib")
endif()
# Set bundled sdl2/qt as dependent options.
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
if (ENABLE_SDL2)
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "NOT MSVC" OFF)
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
endif()
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "ENABLE_SDL2;NOT MSVC" OFF)
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "ENABLE_SDL2" OFF)
# qt stuff
option(ENABLE_QT "Enable the Qt frontend" ON)
@@ -183,8 +320,7 @@ option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
# FreeBSD doesn't have a cubeb port yet, vendoring it isn't required (it's optional anyways)
cmake_dependent_option(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT PLATFORM_FREEBSD" OFF)
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
set(EXT_DEFAULT OFF)
if (MSVC OR ANDROID)
@@ -194,10 +330,14 @@ option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if n
# ffmpeg
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
# sirit
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${EXT_DEFAULT})
set(BUNDLED_SIRIT_DEFAULT OFF)
if ((MSVC AND NOT (CMAKE_BUILD_TYPE MATCHES "Debug|RelWithDebInfo") OR ANDROID))
set(BUNDLED_SIRIT_DEFAULT ON)
endif()
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT})
# Re-allow on FreeBSD once its on mainline ports
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR APPLE" OFF)
@@ -222,6 +362,7 @@ if(YUZU_ENABLE_LTO)
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${COMPILER_SUPPORTS_LTO})
endif()
option(USE_CCACHE "Use ccache for compilation" OFF)
set(CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary")
if(USE_CCACHE)
@@ -233,6 +374,17 @@ if(USE_CCACHE)
else()
message(FATAL_ERROR "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}")
endif()
# Follow SCCache recommendations:
# <https://github.com/mozilla/sccache/blob/main/README.md?plain=1#L144>
if(WIN32)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
endif()
endif()
endif()
# TODO(crueter): CI this?
@@ -266,9 +418,11 @@ if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
# your own copy of it.
set(DEFAULT_ENABLE_OPENSSL OFF)
endif()
if (ENABLE_WEB_SERVICE)
set(DEFAULT_ENABLE_OPENSSL ON)
endif()
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
if (ENABLE_OPENSSL)
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
@@ -302,13 +456,6 @@ if (ANDROID)
set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe
endif()
# We need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format
# See https://github.com/nanoant/CMakePCHCompiler/issues/21
if(WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
endif()
# Default to a Release build
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE)
@@ -529,11 +676,12 @@ else()
find_package(stb MODULE)
find_package(Opus 1.3 MODULE REQUIRED)
find_package(ZLIB 1.2 REQUIRED)
find_package(zstd 1.5 REQUIRED MODULE)
# wow
find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber)
find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber filesystem)
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
find_package(gamemode 1.7 MODULE)
@@ -581,15 +729,15 @@ if (APPLE)
# Umbrella framework for everything GUI-related
find_library(COCOA_LIBRARY Cocoa)
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
find_library(ICONV_LIBRARY iconv REQUIRED)
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
# find_library(ICONV_LIBRARY iconv REQUIRED)
# list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
elseif (WIN32)
# Target Windows 10
add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00)
set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi)
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} winmm iphlpapi ws2_32 wlanapi)
if (MINGW)
# PSAPI is the Process Status API
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version)
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
endif()
elseif (PLATFORM_HAIKU)
# Haiku is so special :)
@@ -602,6 +750,8 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
set(PLATFORM_LIBRARIES rt)
endif()
message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}")
add_subdirectory(externals)
# pass targets from externals
@@ -895,6 +1045,14 @@ if(MSVC)
)
endif()
if (MINGW)
# This saves a truly ridiculous amount of time during linking
# In my tests, without this it takes 2 mins, with it takes 3-5 seconds
# or on GitHub Actions, 10 minutes -> 3 seconds
set(MINGW_FLAGS "-Wl,--strip-all -Wl,--gc-sections")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MINGW_FLAGS}")
endif()
add_subdirectory(src)
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
+11 -2
View File
@@ -542,10 +542,11 @@ function(AddCIPackage)
PACKAGE
EXTENSION
MIN_VERSION
DISABLED_PLATFORMS
)
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN})
set(multiValueArgs DISABLED_PLATFORMS)
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT DEFINED PKG_ARGS_VERSION)
message(FATAL_ERROR "[CPMUtil] VERSION is required")
@@ -594,6 +595,14 @@ function(AddCIPackage)
add_ci_package(windows-arm64)
endif()
if ((MINGW AND ARCHITECTURE_x86_64) AND NOT "mingw-amd64" IN_LIST DISABLED_PLATFORMS)
add_ci_package(mingw-amd64)
endif()
if ((MINGW AND ARCHITECTURE_arm64) AND NOT "mingw-arm64" IN_LIST DISABLED_PLATFORMS)
add_ci_package(mingw-arm64)
endif()
if (ANDROID AND NOT "android" IN_LIST DISABLED_PLATFORMS)
add_ci_package(android)
endif()
-10
View File
@@ -1,10 +0,0 @@
# SPDX-FileCopyrightText: 2020 yuzu Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
function(copy_yuzu_FFmpeg_deps target_dir)
include(WindowsCopyFiles)
set(DLL_DEST "$<TARGET_FILE_DIR:${target_dir}>/")
file(READ "${FFmpeg_PATH}/requirements.txt" FFmpeg_REQUIRED_DLLS)
string(STRIP "${FFmpeg_REQUIRED_DLLS}" FFmpeg_REQUIRED_DLLS)
windows_copy_files(${target_dir} ${FFmpeg_LIBRARY_DIR} ${DLL_DEST} ${FFmpeg_REQUIRED_DLLS})
endfunction(copy_yuzu_FFmpeg_deps)
-8
View File
@@ -1,8 +0,0 @@
# SPDX-FileCopyrightText: 2016 Citra Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
function(copy_yuzu_SDL_deps target_dir)
include(WindowsCopyFiles)
set(DLL_DEST "$<TARGET_FILE_DIR:${target_dir}>/")
windows_copy_files(${target_dir} ${SDL2_DLL_DIR} ${DLL_DEST} SDL2.dll)
endfunction(copy_yuzu_SDL_deps)
+10 -7
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2019 Citra Emulator Project
# SPDX-License-Identifier: GPL-2.0-or-later
@@ -75,16 +78,16 @@ function(find_ffmpeg LIBNAME)
)
else()
list(APPEND INCLUDE_PATHS
/usr/local/include/ffmpeg
/usr/local/include/lib${LIBNAME}
/usr/include/ffmpeg
/usr/include/lib${LIBNAME}
/usr/include/ffmpeg/lib${LIBNAME}
${CMAKE_SYSROOT}/usr/local/include/ffmpeg
${CMAKE_SYSROOT}/usr/local/include/lib${LIBNAME}
${CMAKE_SYSROOT}/usr/include/ffmpeg
${CMAKE_SYSROOT}/usr/include/lib${LIBNAME}
${CMAKE_SYSROOT}/usr/include/ffmpeg/lib${LIBNAME}
)
list(APPEND LIB_PATHS
/usr/local/lib
/usr/lib
${CMAKE_SYSROOT}/usr/local/lib
${CMAKE_SYSROOT}/usr/lib
)
endif()
+7
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 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
@@ -10,6 +13,10 @@ find_package_handle_standard_args(Opus
VERSION_VAR OPUS_VERSION
)
if (PLATFORM_MSYS)
FixMsysPath(PkgConfig::OPUS)
endif()
if (Opus_FOUND AND NOT TARGET Opus::opus)
add_library(Opus::opus ALIAS PkgConfig::OPUS)
endif()
+7
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 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
@@ -10,6 +13,10 @@ find_package_handle_standard_args(SPIRV-Tools
VERSION_VAR SPIRV-Tools_VERSION
)
if (PLATFORM_MSYS)
FixMsysPath(PkgConfig::SPIRV-Tools)
endif()
if (SPIRV-Tools_FOUND AND NOT TARGET SPIRV-Tools::SPIRV-Tools)
if (TARGET SPIRV-Tools)
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools)
+7
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
#
# SPDX-License-Identifier: GPL-3.0-or-later
@@ -11,6 +14,10 @@ find_package_handle_standard_args(enet
VERSION_VAR ENET_VERSION
)
if (PLATFORM_MSYS)
FixMsysPath(PkgConfig::ENET)
endif()
if (enet_FOUND AND NOT TARGET enet::enet)
add_library(enet::enet ALIAS PkgConfig::ENET)
endif()
+7
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
#
# SPDX-License-Identifier: GPL-3.0-or-later
@@ -11,6 +14,10 @@ find_package_handle_standard_args(libusb
VERSION_VAR LIBUSB_VERSION
)
if (PLATFORM_MSYS)
FixMsysPath(PkgConfig::LIBUSB)
endif()
if (libusb_FOUND AND NOT TARGET libusb::usb)
add_library(libusb::usb ALIAS PkgConfig::LIBUSB)
endif()
+8
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: Copyright 2025 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
@@ -9,6 +12,11 @@ if (lz4_CONSIDERED_CONFIGS)
else()
find_package(PkgConfig QUIET)
pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4)
if (PLATFORM_MSYS)
FixMsysPath(PkgConfig::LZ4)
endif()
find_package_handle_standard_args(lz4
REQUIRED_VARS LZ4_LINK_LIBRARIES
VERSION_VAR LZ4_VERSION
+22 -10
View File
@@ -6,22 +6,34 @@
include(FindPackageHandleStandardArgs)
find_package(PkgConfig QUIET)
pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
find_package_handle_standard_args(zstd
REQUIRED_VARS ZSTD_LINK_LIBRARIES
VERSION_VAR ZSTD_VERSION
)
find_package(zstd QUIET CONFIG)
if (zstd_CONSIDERED_CONFIGS)
find_package_handle_standard_args(zstd CONFIG_MODE)
else()
find_package(PkgConfig QUIET)
pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
find_package_handle_standard_args(zstd
REQUIRED_VARS ZSTD_LINK_LIBRARIES
VERSION_VAR ZSTD_VERSION
)
endif()
if (zstd_FOUND AND NOT TARGET zstd::zstd)
if (TARGET zstd::libzstd_shared)
if (TARGET zstd::libzstd_shared AND NOT YUZU_STATIC_BUILD)
add_library(zstd::zstd ALIAS zstd::libzstd_shared)
add_library(zstd::libzstd ALIAS zstd::libzstd_shared)
elseif (TARGET zstd::libzstd_static)
add_library(zstd::zstd ALIAS zstd::libzstd_static)
add_library(zstd::libzstd ALIAS zstd::libzstd_static)
else()
add_library(zstd::zstd ALIAS PkgConfig::ZSTD)
add_library(zstd::libzstd ALIAS PkgConfig::ZSTD)
endif()
endif()
get_target_property(ZSTD_TARGET zstd::zstd ALIASED_TARGET)
if (NOT TARGET zstd::libzstd)
if (ZSTD_TARGET)
add_library(zstd::libzstd ALIAS ${ZSTD_TARGET})
else()
add_library(zstd::libzstd ALIAS zstd::zstd)
endif()
endif()
+21
View File
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
function(FixMsysPath target)
get_target_property(include_dir ${target} INTERFACE_INCLUDE_DIRECTORIES)
if (NOT (include_dir MATCHES "^/"))
return()
endif()
set(root_default $ENV{MSYS2_LOCATION})
if (root_default STREQUAL "")
set(root_default "C:/msys64")
endif()
set(MSYS_ROOT_PATH ${root_default} CACHE STRING "Location of the MSYS2 root")
set(include_dir "C:/msys64${include_dir}")
set_target_properties(${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${include_dir})
endfunction()
-58
View File
@@ -1,58 +0,0 @@
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
set(MINGW_PREFIX /usr/x86_64-w64-mingw32/)
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
set(SDL2_PATH ${MINGW_PREFIX})
set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
# Specify the cross compiler
set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}clang)
set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}clang++)
set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
set(CMAKE_C_COMPILER_AR ${MINGW_TOOL_PREFIX}ar)
set(CMAKE_CXX_COMPILER_AR ${MINGW_TOOL_PREFIX}ar)
set(CMAKE_C_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib)
set(CMAKE_CXX_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib)
# Mingw tools
set(STRIP ${MINGW_TOOL_PREFIX}strip)
set(WINDRES ${MINGW_TOOL_PREFIX}windres)
set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
# ccache wrapper
option(USE_CCACHE "Use ccache for compilation" OFF)
if(USE_CCACHE)
find_program(CCACHE ccache)
if(CCACHE)
message(STATUS "Using ccache found in PATH")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
else(CCACHE)
message(WARNING "USE_CCACHE enabled, but no ccache found")
endif(CCACHE)
endif(USE_CCACHE)
# Search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Echo modified cmake vars to screen for debugging purposes
if(NOT DEFINED ENV{MINGW_DEBUG_INFO})
message("")
message("Custom cmake vars: (blank = system default)")
message("-----------------------------------------")
message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
message("* WINDRES : ${WINDRES}")
message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
message("* STRIP : ${STRIP}")
message("* USE_CCACHE : ${USE_CCACHE}")
message("")
# So that the debug info only appears once
set(ENV{MINGW_DEBUG_INFO} SHOWN)
endif()
-57
View File
@@ -1,57 +0,0 @@
# SPDX-FileCopyrightText: 2018 tech4me <guiwanglong@gmail.com>
# SPDX-License-Identifier: GPL-2.0-or-later
set(MINGW_PREFIX /usr/x86_64-w64-mingw32/)
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
# Actually a hack, w/o this will cause some strange errors
set(CMAKE_HOST_WIN32 TRUE)
set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
set(SDL2_PATH ${MINGW_PREFIX})
set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
# Specify the cross compiler
set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++)
set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
# Mingw tools
set(STRIP ${MINGW_TOOL_PREFIX}strip)
set(WINDRES ${MINGW_TOOL_PREFIX}windres)
set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
# ccache wrapper
option(USE_CCACHE "Use ccache for compilation" OFF)
if(USE_CCACHE)
find_program(CCACHE ccache)
if(CCACHE)
message(STATUS "Using ccache found in PATH")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
else(CCACHE)
message(WARNING "USE_CCACHE enabled, but no ccache found")
endif(CCACHE)
endif(USE_CCACHE)
# Search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Echo modified cmake vars to screen for debugging purposes
if(NOT DEFINED ENV{MINGW_DEBUG_INFO})
message("")
message("Custom cmake vars: (blank = system default)")
message("-----------------------------------------")
message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
message("* WINDRES : ${WINDRES}")
message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
message("* STRIP : ${STRIP}")
message("* USE_CCACHE : ${USE_CCACHE}")
message("")
# So that the debug info only appears once
set(ENV{MINGW_DEBUG_INFO} SHOWN)
endif()
+4 -2
View File
@@ -7,7 +7,9 @@
"version": "3.6.0",
"min_version": "1.1.1",
"disabled_platforms": [
"macos-universal"
"macos-universal",
"mingw-amd64",
"mingw-arm64"
]
},
"boost": {
@@ -18,7 +20,7 @@
"hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9",
"git_version": "1.89.0",
"version": "1.57",
"find_args": "CONFIG",
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
"patches": [
"0001-clang-cl.patch",
"0002-use-marmasm.patch",
Vendored Regular → Executable
View File
+1 -106
View File
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 403 KiB

After

Width:  |  Height:  |  Size: 386 KiB

+27 -56
View File
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 37 KiB

+9
View File
@@ -0,0 +1,9 @@
# Icon variations
These icons are licensed under GPLv3. Please see the [script for generating icons](../../tools/README.md) and appropriatedly redirect for seasonal icons.
- `base_named.svg` - Named variant.
- `base_small.svg`: Variant used for tiny icons (16x16, 64x64, etc).
- `base.svg`: Variant without branding/naming.
Try to keep the icons simple. And preferably automatically be able to be generated (to reduce maintanaince burden). Additionally keep the files small (use `svgo` and `optipng`) to not clutter the git.
+80
View File
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
fill="none"
viewBox="0 0 512 512"
version="1.1"
id="svg7"
sodipodi:docname="base_small.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs7">
<linearGradient
id="linearGradient10"
inkscape:collect="always">
<stop
style="stop-color:#f977d9;stop-opacity:1;"
offset="0"
id="stop10" />
<stop
style="stop-color:#a655d5;stop-opacity:1;"
offset="0.54051435"
id="stop13" />
<stop
style="stop-color:#984fd5;stop-opacity:1;"
offset="0.5714342"
id="stop12" />
<stop
style="stop-color:#8c4ad4;stop-opacity:1;"
offset="0.59666741"
id="stop14" />
<stop
style="stop-color:#3928d2;stop-opacity:1;"
offset="1"
id="stop11" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10"
id="linearGradient11"
x1="264.17508"
y1="28.385544"
x2="264.17508"
y2="488.65109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.97815818,0,0,0.97880258,4.570042,5.8799159)" />
</defs>
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.88388348"
inkscape:cx="153.30075"
inkscape:cy="243.24473"
inkscape:window-width="1600"
inkscape:window-height="849"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg7"
showguides="false" />
<path
id="path9"
style="fill:url(#linearGradient11);fill-opacity:1;stroke:none;stroke-width:13.3314;stroke-opacity:1;paint-order:stroke fill markers"
d="M 262.97461 33.6875 A 218.44267 225.23091 0 0 0 138.83789 73.589844 L 141.13867 72.265625 L 161.2207 65.195312 L 181.01953 61.517578 L 204.35352 64.205078 L 228.96094 76.650391 L 265.80078 115 L 283 99.400391 L 304.59961 85.800781 L 331 76.400391 L 360.59961 69.599609 L 379.95508 69.208984 A 218.44267 225.23091 0 0 0 262.97461 33.6875 z M 380.07617 69.291016 L 350.19922 77.800781 L 329.19922 89.199219 L 307.40039 108 L 288.80078 129.80078 L 287.40039 135 L 302.40039 129.59961 L 319 127.80078 L 348.80078 131.80078 L 370.19922 141.40039 L 393 161.40039 L 399.59961 171.59961 L 374.80078 160.80078 L 338.40039 150.80078 L 309.19922 150 L 288.80078 154.40039 L 293.19922 155.19922 L 319.19922 168.80078 L 338 187.19922 L 350.80078 224 L 349.19922 260 L 326 222.80078 L 302.80078 194 L 277.59961 172.40039 L 269.19922 187.59961 L 256.80078 281.59961 L 258 364 L 278.40039 452.80078 L 297.19531 481.36914 A 218.44267 225.23091 0 0 0 481.41797 258.91797 A 218.44267 225.23091 0 0 0 380.07617 69.291016 z M 133.07422 77.839844 A 218.44267 225.23091 0 0 0 44.533203 258.91797 A 218.44267 225.23091 0 0 0 257.04102 484.06641 L 247.3457 458.62891 L 237.87109 418.18359 L 233.0625 380.42383 L 230.375 354.9668 L 229.95117 321.30859 L 232.35547 291.32812 L 237.44727 254.98242 L 254.55859 191.9082 L 261.62891 172.5332 L 255.54883 174.08984 L 240.98242 180.87695 L 229.59961 190.19922 L 210.59961 208.19922 L 197.40039 229.40039 L 186.40039 252.59961 L 173.40039 269 L 171.40039 253.19922 L 173.59961 229.40039 L 183 202.40039 L 199.40039 178 L 221.04102 153.44141 L 209.02148 155.70508 L 177.05859 162.77539 L 148.06836 171.40234 L 119.92578 183 L 120.63281 180.16992 L 129.82422 165.88672 L 151.17969 147.50195 L 172.95898 135.48242 L 190.07031 129.54102 L 209.02148 127.98633 L 227.6875 128.69336 L 247.76953 128.41016 L 246.49805 125.1582 L 226.69922 105.92383 L 219.62695 97.439453 L 221.4668 90.085938 L 206.75781 94.044922 L 195.86914 95.458984 L 179.46289 88.671875 L 156.12891 81.458984 L 133.07422 77.839844 z " />
<path
style="fill:#1b1b1b;fill-opacity:0.12492698;stroke:none;stroke-width:13.374;stroke-opacity:0.415999;paint-order:stroke fill markers"
d="m 259.36665,490.16617 39.03323,-6.96642 -20,-30.4 -20.4,-88.8 -1.2,-82.4 12.4,-94 8.4,-15.2 25.2,21.6 23.2,28.8 23.2,37.2 1.6,-36 -12.8,-36.8 -18.8,-18.4 -26,-13.6 -4.4,-0.8 20.4,-4.4 29.2,0.8 36.4,10 24.8,10.8 -6.6,-10.2 -22.8,-20 -21.4,-9.6 -29.8,-4 -16.6,1.8 -15,5.4 1.4,-5.2 18.6,-21.8 21.8,-18.800003 21,-11.4 30.2,-8.6 -19.8,0.4 -29.6,6.8 -26.4,9.4 -21.6,13.6 -17.2,15.600003 -36.83882,-38.349628 -24.60732,-12.445079 -23.33452,-2.687006 -19.79899,3.676955 -20.08184,7.071068 -9.33381,5.374012 24.32448,3.818376 23.33452,7.212489 16.40488,6.788226 10.88944,-1.414214 14.70782,-3.959798 -1.83847,7.353911 7.07106,8.485288 19.79899,19.2333 1.2728,3.25269 -20.08184,0.28284 -18.66762,-0.7071 -18.95046,1.55563 -17.11198,5.9397 -21.77889,12.02081 -21.35462,18.38478 -9.19239,14.28356 -0.70711,2.82843 28.14285,-11.59656 28.99138,-8.6267 31.96122,-7.07107 12.02082,-2.26274 -21.64158,24.55783 -16.4,24.4 -9.4,27 -2.2,23.8 2,15.8 13,-16.4 11,-23.2 13.2,-21.2 19,-18 11.38199,-9.32209 14.5664,-6.78822 6.08112,-1.55564 -7.07107,19.37473 -17.11198,63.07393 -5.09117,36.34528 -2.40416,29.98133 0.42426,33.65828 2.68701,25.45585 4.80832,37.7595 9.47523,40.44651 z"
id="path8-4" />
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

+969 -761
View File
File diff suppressed because it is too large Load Diff
+704 -524
View File
File diff suppressed because it is too large Load Diff
+946 -714
View File
File diff suppressed because it is too large Load Diff
+769 -584
View File
File diff suppressed because it is too large Load Diff
+934 -696
View File
File diff suppressed because it is too large Load Diff
+765 -581
View File
File diff suppressed because it is too large Load Diff
+705 -526
View File
File diff suppressed because it is too large Load Diff
+754 -575
View File
File diff suppressed because it is too large Load Diff
+766 -581
View File
File diff suppressed because it is too large Load Diff
+772 -588
View File
File diff suppressed because it is too large Load Diff
+1104 -872
View File
File diff suppressed because it is too large Load Diff
+729 -538
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 29 KiB

-25
View File
@@ -821,31 +821,6 @@ QTabBar QToolButton::left-arrow:disabled {
image: url(:/qss_icons/rc/left_arrow_disabled.png);
}
QDockWidget {
background: #31363b;
border: 1px solid #403F3F;
titlebar-close-icon: url(:/qss_icons/rc/close.png);
titlebar-normal-icon: url(:/qss_icons/rc/undock.png);
}
QDockWidget::close-button,
QDockWidget::float-button {
border: 1px solid transparent;
border-radius: 2px;
background: transparent;
}
QDockWidget::close-button:hover,
QDockWidget::float-button:hover {
background: rgba(255, 255, 255, 10);
}
QDockWidget::close-button:pressed,
QDockWidget::float-button:pressed {
padding: 1px -1px -1px 1px;
background: rgba(255, 255, 255, 10);
}
QTreeView,
QListView {
border: 1px solid #54575B;
-48
View File
@@ -1685,54 +1685,6 @@ QTabBar QToolButton::right-arrow:disabled {
image: url(":/qss_icons/rc/arrow_right_disabled.png");
}
/* QDockWiget -------------------------------------------------------------
--------------------------------------------------------------------------- */
QDockWidget {
outline: 1px solid #32414B;
background-color: #19232D;
border: 1px solid #32414B;
border-radius: 4px;
titlebar-close-icon: url(":/qss_icons/rc/window_close.png");
titlebar-normal-icon: url(":/qss_icons/rc/window_undock.png");
}
QDockWidget::title {
/* Better size for title bar */
padding: 6px;
spacing: 4px;
border: none;
background-color: #32414B;
}
QDockWidget::close-button {
background-color: #32414B;
border-radius: 4px;
border: none;
}
QDockWidget::close-button:hover {
image: url(":/qss_icons/rc/window_close_focus.png");
}
QDockWidget::close-button:pressed {
image: url(":/qss_icons/rc/window_close_pressed.png");
}
QDockWidget::float-button {
background-color: #32414B;
border-radius: 4px;
border: none;
}
QDockWidget::float-button:hover {
image: url(":/qss_icons/rc/window_undock_focus.png");
}
QDockWidget::float-button:pressed {
image: url(":/qss_icons/rc/window_undock_pressed.png");
}
/* QTreeView QListView QTableView -----------------------------------------
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 256 KiB

BIN
View File
Binary file not shown.
+2
View File
@@ -9,6 +9,8 @@
- `DISABLED_PLATFORMS`: List of platforms that lack artifacts for this package. Options:
* `windows-amd64`
* `windows-arm64`
* `mingw-amd64`
* `mingw-arm64`
* `android`
* `solaris-amd64`
* `freebsd-amd64`
+107 -12
View File
@@ -1,24 +1,28 @@
# Caveats
<!-- TOC -->
- [Arch Linux](#arch-linux)
- [Gentoo Linux](#gentoo-linux)
- [macOS](#macos)
- [Solaris](#solaris)
- [HaikuOS](#haikuos)
- [OpenBSD](#openbsd)
- [FreeBSD](#freebsd)
- [NetBSD](#netbsd)
- [Caveats](#caveats)
- [Arch Linux](#arch-linux)
- [Gentoo Linux](#gentoo-linux)
- [macOS](#macos)
- [Solaris](#solaris)
- [HaikuOS](#haikuos)
- [OpenBSD](#openbsd)
- [FreeBSD](#freebsd)
- [NetBSD](#netbsd)
- [MSYS2](#msys2)
- [Windows 8.1 and below](#windows-81-and-below)
<!-- /TOC -->
## Arch Linux
- httplib AUR package is broken. Set `httplib_FORCE_BUNDLED=ON` if you have it installed.
- Eden is also available as an [AUR package](https://aur.archlinux.org/packages/eden-git). If you are unable to build, either use that or compare your process to the PKGBUILD.
Eden is also available as an [AUR package](https://aur.archlinux.org/packages/eden-git). If you are unable to build, either use that or compare your process to the PKGBUILD.
## Gentoo Linux
Do not use the system sirit or xbyak packages.
[`games-emulation/eden`](https://gitweb.gentoo.org/repo/proj/guru.git/tree/games-emulation/eden) is available in the GURU. This repository also contains some additional dependencies, such as mcl, sirit, oaknut, etc.
If you're having issues with building, always consult that ebuild.
## macOS
@@ -26,6 +30,13 @@ macOS is largely untested. Expect crashes, significant Vulkan issues, and other
## Solaris
Always consult [the OpenIndiana package list](https://pkg.openindiana.org/hipster/en/index.shtml) to cross-verify availability.
Run the usual update + install of essential toolings: `sudo pkg update && sudo pkg install git cmake`.
- **gcc**: `sudo pkg install developer/gcc-14`.
- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`.
Qt Widgets appears to be broken. For now, add `-DENABLE_QT=OFF` to your configure command. In the meantime, a Qt Quick frontend is in the works--check back later!
This is needed for some dependencies that call cc directly (tz):
@@ -70,7 +81,7 @@ Still will not run flawlessly until `mesa-24` is available. Modify CMakeCache.tx
After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`.
`-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`.
`-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up.
If clang has errors, try using `g++-11`.
@@ -102,3 +113,87 @@ cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -- -j`nproc`
cmake --install build
```
# DragonFlyBSD
If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt:
```sh
rm /usr/local/lib/gcc11/libstdc++.so.6
ln -s /usr/local/lib/gcc14/libstdc++.so /usr/local/lib/gcc11/libstdc++.so.6
```
This may have unforeseen consequences of which we don't need to worry about for now.
Default `g++` (and the libstdc++) is too outdated - so install `gcc14` and redirect CMake to the new compiler toolchain `-DCMAKE_CXX_COMPILER=gcc14 -DCMAKE_C_COMPILER=g++14`.
There is also `llvm18` and use `-DCMAKE_CXX_COMPILER=clang++18 -DCMAKE_C_COMPILER=clang18` (note the `18` suffix at the end). NOTE: It doesn't have an updated libcxx so `<span>` will be missing, either build it manually or use gcc.
If build hangs, use `hammer2 bulkfree`.
## MSYS2
`qt6-static` isn't supported yet.
Only the `MINGW64` environment is tested; however, all of the others should work (in theory) sans `MINGW32`.
Currently, only FFmpeg can be used as a system dependency; the others will result in linker errors.
When packaging an MSYS2 build, you will need to copy all dependent DLLs recursively alongside the `windeployqt6`; for example:
```sh
# MSYS_TOOLCHAIN is typically just mingw64
# since Windows is case-insensitive, you can set this to $MSYSTEM
# or, if cross-compiling from Linux, set it to usr/x86_64-w64-mingw32
export PATH="/${MSYS_TOOLCHAIN}/bin:$PATH"
# grab deps of a dll or exe and place them in the current dir
deps() {
# string parsing is fun
objdump -p "$1" | awk '/DLL Name:/ {print $3}' | while read -r dll; do
[ -z "$dll" ] && continue
# bin directory is used for DLLs, so we can do a quick "hack"
# and use command to find the path of the DLL
dllpath=$(command -v "$dll" 2>/dev/null || true)
[ -z "$dllpath" ] && continue
# explicitly exclude system32/syswow64 deps
# these aren't needed to be bundled, as all systems already have them
case "$dllpath" in
*System32* | *SysWOW64*) continue ;;
esac
# avoid copying deps multiple times
if [ ! -f "$dll" ]; then
echo "$dllpath"
cp "$dllpath" "$dll"
# also grab the dependencies of the dependent DLL; e.g.
# double-conversion is a dep of Qt6Core.dll but NOT eden.exe
deps "$dllpath"
fi
done
}
# NB: must be done in a directory containing eden.exe
deps eden.exe
# deploy Qt plugins and such
windeployqt6 --no-compiler-runtime --no-opengl-sw --no-system-dxc-compiler \
--no-system-d3d-compiler eden.exe
# grab deps for Qt plugins
find ./*/ -name "*.dll" | while read -r dll; do deps "$dll"; done
```
## Windows 8.1 and below
DirectX 12 is not available - simply copy and paste a random DLL and name it `d3d12.dll`.
Install [Qt6 compatibility libraries](github.com/ANightly/qt6windows7) specifically Qt 6.9.5.
## RedoxOS
The package install may randomly hang at times, in which case it has to be restarted. ALWAYS do a `sudo pkg update` or the chances of it hanging will be close to 90%. If "multiple" installs fail at once, try installing 1 by 1 the packages.
When CMake invokes certain file syscalls - it may sometimes cause crashes or corruptions on the (kernel?) address space - so reboot the system if there is a "hang" in CMake.
+2
View File
@@ -8,6 +8,8 @@ But for new developers you may find that following these guidelines will make ev
Simply put, types/classes are named as `PascalCase`, same for methods and functions like `AddElement`. Variables are named `like_this_snake_case` and constants are `IN_SCREAMING_CASE`.
Except for Qt MOC where `functionName` is preferred.
Template typenames prefer short names like `T`, `I`, `U`, if a longer name is required either `Iterator` or `perform_action` are fine as well.
Macros must always be in `SCREAMING_CASE`. Do not use short letter macros as systems like Solaris will conflict with them; a good rule of thumb is >5 characters per macro - i.e `THIS_MACRO_IS_GOOD`, `AND_ALSO_THIS_ONE`.
+74 -15
View File
@@ -87,6 +87,53 @@ Notes for writers: Include build tools as well, assume user has NOTHING installe
Click on the arrows to expand.
<details>
<summary>Gentoo Linux</summary>
GURU must be enabled:
```
sudo emerge -a app-eselect/eselect-repository
sudo eselect repository enable guru
sudo emaint sync -r guru
```
Now, install all deps:
```sh
sudo emerge -a \
app-arch/lz4 app-arch/zstd app-arch/unzip \
dev-libs/libfmt dev-libs/libusb dev-libs/mcl dev-libs/sirit \
dev-libs/unordered_dense 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-libs/VulkanMemoryAllocator media-libs/libsdl2 media-libs/cubeb \
net-libs/enet net-libs/mbedtls \
sys-libs/zlib \
dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \
games-util/gamemode \
net-wireless/wireless-tools \
dev-qt/qtbase:6 dev-libs/quazip \
virtual/pkgconfig
```
- On `amd64`, also add `dev-libs/xbyak`
- On `riscv64`, also add `dev-libs/biscuit` (currently unavailable)
- On `aarch64`, also add `dev-libs/oaknut`
- If tests are enabled, also add `dev-libs/oaknut` and `dev-cpp/catch`
Required USE flags:
- `dev-qt/qtbase network concurrent dbus gui widgets`
- `dev-libs/quazip qt6`
- `net-libs/mbedtls cmac`
- `media-libs/libsdl2 haptic joystick sound video`
- `dev-cpp/cpp-httplib ssl`
[Caveats](./Caveats.md#gentoo-linux)
</details>
<details>
<summary>Arch Linux</summary>
@@ -149,6 +196,7 @@ apk add g++ git cmake make mbedtls-dev mbedtls-static mesa-dev qt6-qtbase-dev qt
`mbedtls-static` has to be specified otherwise `libeverest.a` and `libp256m.a` will fail to be found.
</details>
<details>
<summary>Void Linux</summary>
```sh
@@ -158,6 +206,7 @@ xbps-install -Su git make cmake clang pkg-config patch mbedtls-devel SPIRV-Tools
Yes, `nlohmann-json` is just named `json-c++`. Why?
</details>
<details>
<summary>NixOS</summary>
@@ -186,7 +235,7 @@ brew install molten-vk vulkan-loader
<details>
<summary>FreeBSD</summary>
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/jwt-cpp devel/unordered-dense`
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/jwt-cpp devel/unordered-dense mbedtls3 vulkan-headers quazip-qt6`
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
@@ -211,18 +260,23 @@ pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gm
[Caveats](./Caveats.md#openbsd).
</details>
<details>
<summary>DragonFlyBSD</summary>
```sh
pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
```
[Caveats](./Caveats.md#dragonflybsd).
</details>
<details>
<summary>Solaris / OpenIndiana</summary>
Always consult [the OpenIndiana package list](https://pkg.openindiana.org/hipster/en/index.shtml) to cross-verify availability.
Run the usual update + install of essential toolings: `sudo pkg update && sudo pkg install git cmake`.
- **gcc**: `sudo pkg install developer/gcc-14`.
- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`.
Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`.
```sh
sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt
```
[Caveats](./Caveats.md#solaris).
@@ -234,24 +288,27 @@ Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/l
* Download and install all dependencies:
```
BASE="git make autoconf libtool automake-wrapper jq patch"
MINGW="SDL2 cmake python-pip qt6-base toolchain ffmpeg boost catch fmt lz4 nlohmann-json openssl zlib zstd enet opus mbedtls vulkan-devel libusb vulkan-memory-allocator unordered_dense clang ccache"
MINGW="qt6-base 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 mbedtls libusb unordered_dense"
packages="$BASE"
for pkg in $MINGW; do
packages="$packages mingw-w64-x86_64-$pkg"
done
pacman -Syu --needed --noconfirm $packages
pacman -Syuu --needed --noconfirm $packages
```
* Notes:
- Using `qt6-static` is possible but currently untested.
- Other environments are entirely untested, but should theoretically work provided you install all the necessary packages.
- Clang is installed as it generally works better here. You can compile with GCC just fine, however.
- GCC is proven to work better with the MinGW environment. If you choose to use Clang, you *may* be better off using the clang64 environment.
- Add `qt-creator` to the `MINGW` variable to install Qt Creator. You can then create a Start Menu shortcut to the MinGW Qt Creator by running `powershell "\$s=(New-Object -COM WScript.Shell).CreateShortcut('C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Qt Creator.lnk');\$s.TargetPath='C:\\msys64\\mingw64\\bin\\qtcreator.exe';\$s.Save()"` in Git Bash or MSYS2.
* Add MinGW binaries to the PATH if they aren't already:
* `echo 'PATH=/mingw64/bin:$PATH' >> ~/.bashrc`
* or `echo 'PATH=/mingw64/bin:$PATH' >> ~/.zshrc`
[Caveats](./Caveats.md#msys2).
</details>
<details>
<summary>HaikuOS</summary>
@@ -263,14 +320,16 @@ pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel b
[Caveats](./Caveats.md#haikuos).
</details>
<details>
<summary>RedoxOS</summary>
TODO: Fix syscall crashes (heavy IO stalls and hangup due to net mutexes?)
```sh
sudo pkg update && sudo pkg install git cmake
sudo pkg install ffmpeg6 sdl2 zlib llvm18
sudo pkg update
sudo pkg install git cmake ffmpeg6 sdl2 zlib llvm18
```
[Caveats](./Caveats.md#redoxos).
</details>
## All Done
-7
View File
@@ -160,13 +160,6 @@ if (YUZU_USE_BUNDLED_SIRIT)
AddJsonPackage(sirit-ci)
else()
AddJsonPackage(sirit)
# Change to old-but-more-cacheable debug info on Windows
if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
get_target_property(sirit_opts sirit COMPILE_OPTIONS)
list(FILTER sirit_opts EXCLUDE REGEX "/Zi")
list(APPEND sirit_opts "/Z7")
set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${sirit_opts}")
endif()
if(MSVC AND CXX_CLANG)
target_compile_options(siritobj PRIVATE -Wno-error=unused-command-line-argument)
endif()
+5 -1
View File
@@ -23,7 +23,11 @@
"package": "sirit",
"name": "sirit",
"repo": "eden-emulator/sirit",
"version": "1.0.2"
"version": "1.0.2",
"disabled_platforms": [
"mingw-amd64",
"mingw-arm64"
]
},
"httplib": {
"repo": "yhirose/cpp-httplib",
+25 -8
View File
@@ -25,18 +25,26 @@ if (UNIX AND NOT ANDROID)
if (NOT APPLE)
# In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so
if(PLATFORM_SUN)
list(APPEND FFmpeg_HWACCEL_LIBRARIES
X11
"/usr/lib/xorg/amd64/libdrm.so")
find_library(LIBDRM_LIB libdrm PATHS /usr/lib/64 /usr/lib/amd64 /usr/lib)
if(LIBDRM_LIB)
list(APPEND FFmpeg_HWACCEL_LIBRARIES
X11
"${LIBDRM_LIB}")
message(STATUS "Found libdrm at: ${LIBDRM_LIB}")
else()
message(WARNING "libdrm not found, disabling libdrm support")
list(APPEND FFmpeg_HWACCEL_FLAGS
--disable-libdrm)
endif()
else()
pkg_check_modules(LIBDRM libdrm REQUIRED)
list(APPEND FFmpeg_HWACCEL_LIBRARIES
${LIBDRM_LIBRARIES})
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
${LIBDRM_INCLUDE_DIRS})
list(APPEND FFmpeg_HWACCEL_FLAGS
--enable-libdrm)
endif()
list(APPEND FFmpeg_HWACCEL_FLAGS
--enable-libdrm)
endif()
if(LIBVA_FOUND)
@@ -89,7 +97,7 @@ if (UNIX AND NOT ANDROID)
endif(CUDA_FOUND)
endif()
if (VDPAU_FOUND)
if (VDPAU_FOUND AND NOT APPLE)
list(APPEND FFmpeg_HWACCEL_FLAGS
--enable-vdpau
--enable-hwaccel=h264_vdpau
@@ -107,9 +115,10 @@ endif()
if (YUZU_USE_BUNDLED_FFMPEG)
# MSVC conflicts with ksuser otherwise
# MinGW has the funny quirk of requiring avutil after avcodec
# Android needs some deps to be compiled with PIC (TODO)
# TODO(crueter) fix
if (MSVC OR ANDROID)
if (ANDROID)
set(BUILD_SHARED_LIBS ON)
else()
set(BUILD_SHARED_LIBS OFF)
@@ -246,11 +255,19 @@ else()
SYSTEM_THREADS)
set(FFmpeg_BUILD_LIBRARIES ${FFmpeg_LIBRARIES})
# BSD make or Solaris make don't support ffmpeg make-j8
if (PLATFORM_LINUX OR ANDROID OR APPLE OR WIN32 OR PLATFORM_FREEBSD)
set(FFmpeg_MAKE_ARGS -j${SYSTEM_THREADS})
else()
set(FFmpeg_MAKE_ARGS "")
endif()
add_custom_command(
OUTPUT
${FFmpeg_BUILD_LIBRARIES}
COMMAND
make -j${SYSTEM_THREADS}
make ${FFmpeg_MAKE_ARGS}
WORKING_DIRECTORY
${FFmpeg_BUILD_DIR}
)
+1 -1
View File
@@ -15,7 +15,7 @@
"disabled_platforms": [
"freebsd-amd64",
"solaris-amd64",
"macos-universal"
"openbsd-amd64"
]
}
}
+2 -2
View File
@@ -5,7 +5,7 @@
"git_host": "git.crueter.xyz",
"artifact": "%VERSION%.tar.gz",
"tag": "%VERSION%",
"hash": "87abb2aeca716d5d77b05317086dbc2f8acfc2f3f76ce4778345ee3df19973e6cd8ecbf16cfab5ad94c9636a6c44fd3588f9aadd3cba89403cfd56c8bec645c5",
"version": "091025"
"hash": "dc37a189a44ce8b5c988ca550582431a6c7eadfd3c6e709bee6277116ee803e714333e85c9e6cbb5c69346a14d6f2cc7ed96e8aa09cc5fb8a89f945059651db6",
"version": "121125"
}
}
+10 -6
View File
@@ -9,11 +9,15 @@ pkgs.mkShellNoCC {
# libraries
openssl boost fmt nlohmann_json lz4 zlib zstd
enet libopus vulkan-headers vulkan-utility-libraries
spirv-tools spirv-headers simpleini vulkan-memory-allocator
vulkan-loader unzip mbedtls glslang python3 httplib
cpp-jwt ffmpeg-headless libusb1 cubeb
qt6.full # eden
SDL2 # eden-cli
discord-rpc gamemode # optional components
spirv-tools spirv-headers vulkan-loader unzip mbedtls
glslang python3 httplib cpp-jwt ffmpeg-headless
libusb1 cubeb
# eden
qt6.qtbase qt6.qtmultimedia qt6.qtwayland qt6.qttools
qt6.qtwebengine qt6.qt5compat
# eden-cli
SDL2
# optional components
discord-rpc gamemode
];
}
+19 -11
View File
@@ -35,7 +35,6 @@ if (MSVC AND NOT CXX_CLANG)
# /W4 - Level 4 warnings
# /MP - Multi-threaded compilation
# /Zi - Output debugging information
# /Zm - Specifies the precompiled header memory allocation limit
# /Zo - Enhanced debug info for optimized builds
# /permissive- - Enables stricter C++ standards conformance checks
@@ -98,11 +97,6 @@ if (MSVC AND NOT CXX_CLANG)
)
endif()
if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
endif()
if (ARCHITECTURE_x86_64)
add_compile_options(/QIntel-jcc-erratum)
endif()
@@ -127,7 +121,7 @@ else()
-Werror=unused
-Wno-attributes
-Wno-invalid-offsetof
$<$<COMPILE_LANGUAGE:CXX>:-Wno-invalid-offsetof>
-Wno-unused-parameter
-Wno-missing-field-initializers
)
@@ -176,13 +170,27 @@ else()
add_compile_definitions(_FILE_OFFSET_BITS=64)
endif()
if (YUZU_STATIC_BUILD)
add_compile_definitions(QT_STATICPLUGIN)
# macos doesn't even let you make static executables... wtf?
if (NOT APPLE)
add_compile_options(-static)
if (YUZU_STATIC_BUILD)
# yuzu-cmd requires us to explicitly link libpthread, libgcc, and libstdc++ as static
# At a guess, it's probably because Qt handles the Qt executable for us, whereas this does not
add_link_options(-static -lpthread)
add_link_options(-static-libgcc -static-libstdc++)
endif()
endif()
endif()
if (MINGW)
add_compile_definitions(MINGW_HAS_SECURE_API)
add_compile_options("-msse4.1")
if (MINGW_STATIC_BUILD)
add_compile_definitions(QT_STATICPLUGIN)
add_compile_options("-static")
# Only windows has this requirement, thanks windows
if (WIN32 AND ARCHITECTURE_x86_64)
add_compile_options("-msse4.1")
endif()
endif()
@@ -16,11 +16,15 @@ import java.io.FileOutputStream
import java.security.KeyStore
import javax.net.ssl.TrustManagerFactory
import javax.net.ssl.X509TrustManager
import android.content.res.Configuration
import android.os.LocaleList
import org.yuzu.yuzu_emu.features.settings.model.IntSetting
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
import org.yuzu.yuzu_emu.utils.DocumentsTree
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.Log
import org.yuzu.yuzu_emu.utils.PowerStateUpdater
import java.util.Locale
fun Context.getPublicFilesDir(): File = getExternalFilesDir(null) ?: filesDir
@@ -73,5 +77,38 @@ class YuzuApplication : Application() {
val appContext: Context
get() = application.applicationContext
private val LANGUAGE_CODES = arrayOf(
"system", "en", "es", "fr", "de", "it", "pt", "pt-BR", "ru", "ja", "ko",
"zh-CN", "zh-TW", "pl", "cs", "nb", "hu", "uk", "vi", "id", "ar", "ckb", "fa", "he", "sr"
)
fun applyLanguage(context: Context): Context {
val languageIndex = IntSetting.APP_LANGUAGE.getInt()
val langCode = if (languageIndex in LANGUAGE_CODES.indices) {
LANGUAGE_CODES[languageIndex]
} else {
"system"
}
if (langCode == "system") {
return context
}
val locale = when {
langCode.contains("-") -> {
val parts = langCode.split("-")
Locale.Builder().setLanguage(parts[0]).setRegion(parts[1]).build()
}
else -> Locale.Builder().setLanguage(langCode).build()
}
Locale.setDefault(locale)
val config = Configuration(context.resources.configuration)
config.setLocales(LocaleList(locale))
return context.createConfigurationContext(config)
}
}
}
@@ -86,6 +86,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
private var foregroundService: Intent? = null
override fun attachBaseContext(base: Context) {
super.attachBaseContext(YuzuApplication.applyLanguage(base))
}
override fun onCreate(savedInstanceState: Bundle?) {
Log.gameLaunched = true
ThemeHelper.setTheme(this)
@@ -32,6 +32,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
MAX_ANISOTROPY("max_anisotropy"),
THEME("theme"),
THEME_MODE("theme_mode"),
APP_LANGUAGE("app_language"),
OVERLAY_SCALE("control_scale"),
OVERLAY_OPACITY("control_opacity"),
LOCK_DRAWER("lock_drawer"),
@@ -667,10 +667,11 @@ abstract class SettingsItem(
)
)
put(
SliderSetting(
SpinBoxSetting(
IntSetting.CPU_TICKS,
titleId = R.string.cpu_ticks,
descriptionId = 0,
valueHint = R.string.cpu_ticks,
min = 77,
max = 65535
)
@@ -756,6 +757,15 @@ abstract class SettingsItem(
titleId = R.string.enable_update_checks,
)
)
put(
SingleChoiceSetting(
IntSetting.APP_LANGUAGE,
titleId = R.string.app_language,
descriptionId = R.string.app_language_description,
choicesId = R.array.appLanguageNames,
valuesId = R.array.appLanguageValues
)
)
put(
SwitchSetting(
BooleanSetting.RENDERER_DEBUG,
@@ -1,8 +1,13 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
package org.yuzu.yuzu_emu.features.settings.ui
import android.content.Context
import org.yuzu.yuzu_emu.YuzuApplication
import android.os.Bundle
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
@@ -24,6 +29,7 @@ import org.yuzu.yuzu_emu.features.input.NativeInput
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
import org.yuzu.yuzu_emu.fragments.ResetSettingsDialogFragment
import org.yuzu.yuzu_emu.utils.*
import org.yuzu.yuzu_emu.utils.collect
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
@@ -32,6 +38,10 @@ class SettingsActivity : AppCompatActivity() {
private val settingsViewModel: SettingsViewModel by viewModels()
override fun attachBaseContext(base: Context) {
super.attachBaseContext(YuzuApplication.applyLanguage(base))
}
override fun onCreate(savedInstanceState: Bundle?) {
ThemeHelper.setTheme(this)
@@ -125,6 +135,16 @@ class SettingsActivity : AppCompatActivity() {
NativeConfig.savePerGameConfig()
NativeConfig.unloadPerGameConfig()
}
if (settingsViewModel.shouldRecreateForLanguageChange.value) {
settingsViewModel.setShouldRecreateForLanguageChange(false)
val relaunchIntent = packageManager?.getLaunchIntentForPackage(packageName)
if (relaunchIntent != null) {
relaunchIntent.addFlags(android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK or android.content.Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(relaunchIntent)
android.os.Process.killProcess(android.os.Process.myPid())
}
}
}
}
@@ -425,6 +425,14 @@ class SettingsAdapter(
position
).show(fragment.childFragmentManager, SettingsDialogFragment.TAG)
// reset language if detected
if (item.setting.key == "app_language") {
// recreate page apply language change instantly
fragment.requireActivity().recreate()
settingsViewModel.setShouldRecreateForLanguageChange(true)
}
return true
}
@@ -14,6 +14,9 @@ import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.MotionEvent
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
@@ -197,6 +200,54 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
updateValidity(newValue)
}
fun attachRepeat(button: View, delta: Int) {
val handler = Handler(Looper.getMainLooper())
var runnable: Runnable? = null
val initialDelay = 400L
val minDelay = 40L
val accelerationFactor = 0.75f
button.setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
val newValue = (current + delta)
spinboxBinding.editValue.setText(newValue.toString())
updateValidity(newValue)
var delay = initialDelay
runnable = object : Runnable {
override fun run() {
val curr = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
val next = curr + delta
spinboxBinding.editValue.setText(next.toString())
updateValidity(next)
// accelerate
delay = (delay * accelerationFactor).toLong().coerceAtLeast(minDelay)
handler.postDelayed(this, delay)
}
}
handler.postDelayed(runnable!!, initialDelay)
true
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
if (runnable != null) {
handler.removeCallbacks(runnable!!)
runnable = null
}
v.performClick()
true
}
else -> false
}
}
}
attachRepeat(spinboxBinding.buttonDecrement, -1)
attachRepeat(spinboxBinding.buttonIncrement, 1)
spinboxBinding.editValue.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
@@ -336,6 +387,12 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
.show()
}
scSetting.setSelectedValue(value)
if (scSetting.setting.key == "app_language") {
settingsViewModel.setShouldRecreateForLanguageChange(true)
// recreate page apply language change instantly
requireActivity().recreate()
}
}
is StringSingleChoiceSetting -> {
@@ -1030,8 +1030,10 @@ class SettingsFragmentPresenter(
override fun reset() = IntSetting.THEME.setInt(defaultValue)
}
add(HeaderSetting(R.string.app_settings))
add(IntSetting.APP_LANGUAGE.key)
if (NativeLibrary.isUpdateCheckerEnabled()) {
add(HeaderSetting(R.string.app_settings))
add(BooleanSetting.ENABLE_UPDATE_CHECKS.key)
}
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -54,6 +57,8 @@ class SettingsViewModel : ViewModel() {
private val _shouldShowResetInputDialog = MutableStateFlow(false)
val shouldShowResetInputDialog = _shouldShowResetInputDialog.asStateFlow()
private val _shouldRecreateForLanguageChange = MutableStateFlow(false)
val shouldRecreateForLanguageChange = _shouldRecreateForLanguageChange.asStateFlow()
fun setShouldRecreate(value: Boolean) {
_shouldRecreate.value = value
}
@@ -103,6 +108,10 @@ class SettingsViewModel : ViewModel() {
_shouldShowResetInputDialog.value = value
}
fun setShouldRecreateForLanguageChange(value: Boolean) {
_shouldRecreateForLanguageChange.value = value
}
fun getCurrentDeviceParams(defaultParams: ParamPackage): ParamPackage =
try {
InputHandler.registeredControllers[currentDevice]
@@ -1511,7 +1511,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
emulationState.newSurface(holder.surface)
} else {
emulationState.newSurface(holder.surface)
// Surface changed due to rotation/config change
// Only update surface reference, don't trigger state changes
emulationState.updateSurfaceReference(holder.surface)
}
}
@@ -1842,6 +1844,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
}
}
@Synchronized
fun updateSurfaceReference(surface: Surface?) {
this.surface = surface
if (this.surface != null && state == State.RUNNING) {
NativeLibrary.surfaceChanged(this.surface)
}
}
@Synchronized
fun clearSurface() {
if (surface == null) {
@@ -4,6 +4,7 @@
package org.yuzu.yuzu_emu.ui.main
import android.content.Intent
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.view.View
@@ -53,6 +54,7 @@ import org.yuzu.yuzu_emu.activities.EmulationActivity
import kotlin.text.compareTo
import androidx.core.net.toUri
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
import org.yuzu.yuzu_emu.YuzuApplication
class MainActivity : AppCompatActivity(), ThemeProvider {
private lateinit var binding: ActivityMainBinding
@@ -68,6 +70,10 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
private val CHECKED_DECRYPTION = "CheckedDecryption"
private var checkedDecryption = false
override fun attachBaseContext(base: Context) {
super.attachBaseContext(YuzuApplication.applyLanguage(base))
}
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { !DirectoryInitialization.areDirectoriesReady }
@@ -62,6 +62,7 @@ namespace AndroidSettings {
Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android};
Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds",
Settings::Category::Android};
Settings::Setting<s32> app_language{linkage, 0, "app_language", Settings::Category::Android};
Settings::Setting<bool> enable_update_checks{linkage, true, "enable_update_checks",
Settings::Category::Android};
+2
View File
@@ -4,6 +4,8 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#define VMA_IMPLEMENTATION
#include "video_core/vulkan_common/vma.h"
#include <codecvt>
#include <locale>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 65 KiB

+172 -166
View File
@@ -5,8 +5,8 @@
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
<string name="notice_notification_channel_description">عرض الإشعارات عند حدوث خطأ ما.</string>
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار!</string>
<string name="app_notification_channel_description">إشعارات محاكي عدن سويتش</string>
<string name="app_notification_running">عدن قيد التشغيل</string>
<string name="app_notification_channel_description">إشعارات محاكي السويتش Eden</string>
<string name="app_notification_running">Eden قيد التشغيل</string>
<string name="seconds">ثواني</string>
<!-- Spinbox strings -->
@@ -27,17 +27,17 @@
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(مُحسَّن)</string>
<string name="enhanced_fps_suffix">(Enhanced)</string>
<string name="process_ram">Process RAM: %1$d MB</string>
<string name="shaders_prefix">بناء</string>
<string name="shaders_suffix">شادر(شادرات)</string>
<string name="shaders_suffix">مظلل (مظللات)</string>
<string name="charging">(يشحن)</string>
<string name="system_info_label">النظام:</string>
<string name="show_stats_overlay">عرض إحصائيات الأداء</string>
<string name="stats_overlay_customization">تخصيص</string>
<string name="show_stats_overlay">عرض تراكب إحصائيات الأداء</string>
<string name="stats_overlay_customization">التخصيص</string>
<string name="stats_overlay_items">الرؤية</string>
<string name="stats_overlay_options">العرض</string>
<string name="stats_overlay_options">تراكب الأداء</string>
<string name="enable_stats_overlay_">تمكين تراكب إحصائيات الأداء</string>
<string name="stats_overlay_options_description">قم بتكوين المعلومات التي يتم عرضها في تراكب إحصائيات الأداء</string>
<string name="show_fps">عرض معدل الإطارات</string>
@@ -50,53 +50,53 @@
<string name="show_system_ram_usage_description">عرض كمية ذاكرة الوصول العشوائي المستخدمة من قبل النظام</string>
<string name="show_bat_temperature">عرض درجة حرارة البطارية</string>
<string name="show_bat_temperature_description">عرض درجة حرارة البطارية الحالية</string>
<string name="bat_temperature_unit">وحدات درجة حرارة البطارية</string>
<string name="bat_temperature_unit">وحدات قياس درجة حرارة البطارية</string>
<string name="show_power_info">عرض معلومات البطارية</string>
<string name="show_power_info_description">عرض استهلاك الطاقة الحالي والسعة المتبقية في البطارية</string>
<string name="show_shaders_building">عرض بناء الشادرات</string>
<string name="show_shaders_building_description">عرض العدد الحالي للشادرات التي يتم بناؤها</string>
<string name="overlay_position">موضع العرض</string>
<string name="overlay_position_description">اختيار مكان عرض الإحصائيات على الشاشة</string>
<string name="overlay_position_top_left">أعلى اليسار</string>
<string name="overlay_position_top_right">أعلى اليمين</string>
<string name="overlay_position_bottom_left">أسفل اليسار</string>
<string name="overlay_position_bottom_right">أسفل اليمين</string>
<string name="show_shaders_building">عرض بناء الظلال</string>
<string name="show_shaders_building_description">عرض عدد الظلال التي يتم بناؤها</string>
<string name="overlay_position">موضع التراكب</string>
<string name="overlay_position_description">اختر مكان عرض التراكب على الشاشة</string>
<string name="overlay_position_top_left">أعلى اليمين</string>
<string name="overlay_position_top_right">أعلى اليسار</string>
<string name="overlay_position_bottom_left">أسفل اليمين</string>
<string name="overlay_position_bottom_right">أسفل اليسار</string>
<string name="overlay_position_center_top">منتصف الأعلى</string>
<string name="overlay_position_center_bottom">منتصف الأسفل</string>
<string name="perf_overlay_background">خلفية العرض</string>
<string name="perf_overlay_background_description">إضافة خلفية لعرض الإحصائيات لسهولة القراءة</string>
<string name="perf_overlay_background">خلفية التراكب</string>
<string name="perf_overlay_background_description">يضيف خلفية خلف التراكب لتسهيل القراءة</string>
<!-- Device Overlay settings -->
<string name="show_soc_overlay">عرض تراكب معلومات الجهاز</string>
<string name="enable_soc_overlay">تمكين تراكب الجهاز</string>
<string name="soc_overlay_options">تراكب الجهاز</string>
<string name="soc_overlay_options_description">تكوين المعلومات المعروضة في تراكب الجهاز</string>
<string name="soc_overlay_options_description">تكوين المعلومات التي يتم عرضها في تراكب الجهاز</string>
<string name="show_device_model">عرض طراز الجهاز</string>
<string name="show_device_model_description">عرض طراز الجهاز المضيف</string>
<string name="show_gpu_model">عرض طراز GPU</string>
<string name="show_gpu_model_description">عرض طراز GPU المضيف</string>
<string name="show_soc_model">عرض طراز SoC</string>
<string name="show_soc_model_description">عرض طراز SoC المضيف</string>
<string name="show_fw_version">عرض إصدار الفريموير</string>
<string name="show_fw_version_description">عرض إصدار الفريموير</string>
<string name="show_gpu_model">عرض طراز وحدة معالجة الرسومات</string>
<string name="show_gpu_model_description">عرض طراز وحدة معالجة الرسومات المضيفة</string>
<string name="show_soc_model">عرض طراز الرقائق</string>
<string name="show_soc_model_description">عرض طراز رقائق المضيف</string>
<string name="show_fw_version">عرض إصدار الفيرموير</string>
<string name="show_fw_version_description">عرض إصدار الفيرموير</string>
<!-- Eden\'s Veil -->
<string name="eden_veil">حجاب عدن</string>
<string name="eden_veil">حجاب Eden</string>
<string name="eden_veil_description">إعدادات تجريبية لتحسين الأداء والقدرة. قد تسبب هذه الإعدادات شاشات سوداء أو مشاكل أخرى في اللعبة.</string>
<string name="veil_extensions">امتدادات GPU</string>
<string name="veil_extensions">امتدادات وحدة معالجة الرسوميات</string>
<string name="dyna_state">الحالة الديناميكية الموسعة</string>
<string name="dyna_state_description">يتحكم في عدد المميزات التي يمكن استخدامها في الحالة الديناميكية الموسعة. الأرقام الأعلى تسمح بميزات أكثر ويمكن أن تعزز الأداء، ولكن قد تسبب مشكلات مع بعض السائقين والبائعين. قد تختلف القيمة الافتراضية بحسب نظامك وقدرات الأجهزة. يمكن تغيير هذه القيمة حتى يتم تحقيق الاستقرار وجودة الصورة الأفضل.</string>
<string name="disabled">معطل</string>
<string name="provoking_vertex">الرأس المثير</string>
<string name="provoking_vertex_description">يحسن الإضاءة ومعالجة الرؤوس في بعض الألعاب. مدعوم فقط على وحدات معالجة الرسومات التي تدعم فولكان 1.0+.</string>
<string name="descriptor_indexing">فهرسة الواصفات</string>
<string name="descriptor_indexing_description">يحسن معالجة القوام والمخازن المؤقتة، بالإضافة إلى طبقة ترجمة ماكسويل. مدعوم من قبل بعض وحدات معالجة الرسومات التي تدعم فولكان 1.1 وجميع وحدات معالجة الرسومات التي تدعم فولكان 1.2+.</string>
<string name="provoking_vertex_description">يحسن الإضاءة ومعالجة الرؤوس في بعض الألعاب. مدعوم فقط على وحدات معالجة الرسومات التي تدعم فولكان 1.0+</string>
<string name="descriptor_indexing">فهرسة الوصف</string>
<string name="descriptor_indexing_description">يحسن معالجة النسيج والمخزن المؤقت، بالإضافة إلى طبقة الترجمة Maxwell. مدعوم من بعض وحدات معالجة الرسومات Vulkan 1.1 وجميع وحدات معالجة الرسومات Vulkan 1.2+.</string>
<string name="sample_shading">تظليل العينة</string>
<string name="sample_shading_description">يسمح لمُظلل الأجزاء بالتنفيذ لكل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب بعض الأداء. تدعم فقط أجهزة Vulkan 1.1+ هذا الامتداد.</string>
<string name="sample_shading_description">يسمح لمظلل الأجزاء بتنفيذ كل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب بعض الأداء. لا تدعم هذه الإضافة سوى أجهزة Vulkan 1.1+ فقط.</string>
<string name="sample_shading_fraction">كسر التظليل العيني</string>
<string name="sample_shading_fraction_description">شدة تمرير التظليل العيني. القيم الأعلى تحسن الجودة أكثر ولكنها تقلل الأداء بدرجة أكبر.</string>
<string name="sample_shading_fraction_description">كثافة تمرير تظليل العينة. تؤدي القيم الأعلى إلى تحسين الجودة بشكل أكبر، ولكنها تقلل أيضًا من الأداء إلى حد كبير.</string>
<string name="veil_renderer">العارض</string>
<string name="frame_interpolation">تحسين سرعة الإطارات</string>
@@ -116,7 +116,7 @@
<string name="use_fast_cpu_time">وقت وحدة المعالجة المركزية السريع</string>
<string name="use_fast_cpu_time_description">يجبر وحدة المعالجة المركزية المحاكاة على العمل بسرعة أعلى، مما يقلل من بعض محددات معدل الإطارات. هذا الخيار غير مستقر وقد يسبب مشاكل، وقد يرى المستخدمون بأجهزة أضعف انخفاضًا في الأداء.</string>
<string name="custom_cpu_ticks">تخصيص دورات المعالج</string>
<string name="custom_cpu_ticks_description">تعيين قيمة مخصصة لدورات المعالج. القيم الأعلى قد تزيد الأداء، ولكن قد تتسبب أيضًا في تجمد اللعبة. يوصى بنطاق 77-21000.</string>
<string name="custom_cpu_ticks_description">قم بتعيين قيمة مخصصة لدورات المعالج. القيم الأعلى يمكن أن تزيد من الأداء، ولكنها قد تتسبب أيضًا في تجميد اللعبة. يوصى باستخدام نطاق 77-21000.</string>
<string name="cpu_ticks">دورات</string>
<string name="skip_cpu_inner_invalidation">تخطي إبطال ذاكرة التخزين المؤقت الداخلية للوحدة المركزية</string>
<string name="skip_cpu_inner_invalidation_description">يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقت أثناء تحديثات الذاكرة، مما يقلل استخدام المعالج ويحسن أدائه. قد يسبب هذا أعطالاً أو تعطلًا في بعض الألعاب.</string>
@@ -130,7 +130,7 @@
<string name="dma_accuracy_description">يتحكم في دقة تحديد DMA. يمكن أن تصلح الدقة الآمنة المشاكل في بعض الألعاب، ولكنها قد تؤثر أيضًا على الأداء في بعض الحالات. إذا كنت غير متأكد، اترك هذا على الوضع الافتراضي.</string>
<!-- Shader Backend -->
<string name="shader_backend">خلفية Shader</string>
<string name="shader_backend">واجهة برمجة الظلال</string>
<string name="shader_backend_description">Choose how shaders are compiled and translated for your GPU.</string>
<string name="shader_backend_glsl">GLSL</string>
<string name="shader_backend_glasm">GLASM</string>
@@ -150,7 +150,7 @@
<!-- Multiplayer -->
<string name="multiplayer">متعدد اللاعبين</string>
<string name="multiplayer_description">استضف غرفة لعبتك الخاصة أو انضم إلى غرفة موجودة للعب مع الآخرين</string>
<string name="multiplayer_description">استضف غرفة ألعاب خاصة بك أو انضم إلى غرفة موجودة بالفعل للعب مع الآخرين</string>
<string name="multiplayer_create_room">إنشاء</string>
<string name="multiplayer_join_room">الانضمام</string>
<string name="multiplayer_public_room">تصفح الغرف العامة</string>
@@ -163,7 +163,7 @@
<string name="multiplayer_network_error">خطأ في الشبكة</string>
<string name="multiplayer_lost_connection">فقدان الاتصال</string>
<string name="multiplayer_name_collision">اسم المستخدم محجوز مسبقاً</string>
<string name="multiplayer_mac_collision">تعارض في عنوان MAC</string>
<string name="multiplayer_mac_collision">تعارض عناوين MAC</string>
<string name="multiplayer_console_id_collision">تعارض معرف وحدة التحكم</string>
<string name="multiplayer_wrong_version">إصدار خاطئ</string>
<string name="multiplayer_wrong_password">كلمة مرور خاطئة</string>
@@ -217,11 +217,11 @@
<string name="multiplayer_search_public_lobbies">البحث في الغرف…</string>
<string name="multiplayer_preferred_game_name">اللعبة المفضلة</string>
<string name="multiplayer_lobby_type">نوع الغرفة</string>
<string name="multiplayer_room_name_error">يجب أن يكون بين 3 و20 حرفًا</string>
<string name="multiplayer_room_name_error">يجب أن يتكون من 3 إلى 20 حرفًا</string>
<string name="multiplayer_required">مطلوب</string>
<string name="multiplayer_token_required">مطلوب رمز ويب، انتقل إلى الإعدادات المتقدمة -&gt; النظام -&gt; الشبكة</string>
<string name="multiplayer_ip_error">تنسيق IP غير صالح</string>
<string name="multiplayer_username_error">يجب أن يكون بين 4-20 حرفًا ، وأن يحتوي على شخصيات أبجدية رقمية وفترات واندفاعات وتأكيدات ومساحات فقط</string>
<string name="multiplayer_username_error">يجب أن يتكون من 4 إلى 20 حرفًا، وأن يحتوي على أحرف أبجدية رقمية ونقاط وشرطات وشرطات سفلية ومسافات فقط</string>
<string name="multiplayer_nickname_invalid">اسم مستخدم غير صالح، تأكد من إعداده بشكل صحيح في النظام → الشبكة</string>
<string name="multiplayer_token_error">يجب أن يتكون من 48 حرفًا، وأحرف صغيرة من a-z فقط</string>
<string name="multiplayer_port_error">يجب أن يكون بين 1 و65535</string>
@@ -233,23 +233,24 @@
<string name="multiplayer_unlisted_visibility">غير مدرج</string>
<!-- Setup strings -->
<string name="welcome">مرحبا</string>
<string name="welcome_description">تعلم كيفية إعداد <b>عدن</b> والقفز إلى المحاكاة.</string>
<string name="get_started">لنبدأ</string>
<string name="welcome">مرحبًا!</string>
<string name="welcome_description">تعلم كيفية إعداد <b>Eden</b> والبدء في المحاكاة.</string>
<string name="get_started">ابدأ الآن</string>
<string name="keys">المفاتيح</string>
<string name="keys_description">اختر ملف <b>prod.keys</b> من الزر ادناه</string>
<string name="select_keys">إختيار المفاتيح</string>
<string name="firmware">الفريموير</string>
<string name="select_firmware">حدد الفريموير</string>
<string name="keys_description">اختر ملف <b>prod.keys</b> الخاص بك باستخدام الزر أدناه.</string>
<string name="select_keys">اختر المفاتيح</string>
<string name="firmware">الفيرموير</string>
<string name="firmware_description">قم بتحديد ملف <b>firmware.zip</b> الخاص بك باستخدام الزر الموجود أدناه.</string>
<string name="select_firmware">حدد الفيرموير</string>
<string name="games">الألعاب</string>
<string name="games_description">حدد مجلد <b>العابك</b> من الزر ادناه.</string>
<string name="games_description">حدد مجلد <b>الألعاب</b> الخاص بك باستخدام الزر أدناه.</string>
<string name="done">إنهاء</string>
<string name="done_description">أنت جاهز تمامًا.\nاستمتع بألعابك!</string>
<string name="text_continue">استمر</string>
<string name="next">التالي</string>
<string name="back">عودة</string>
<string name="add_games">إضافة الألعاب</string>
<string name="step_complete">مكتمل</string>
<string name="step_complete">انتهى!</string>
<!-- Home strings -->
@@ -257,16 +258,19 @@
<string name="view_list">قائمة</string>
<string name="view_grid">شبكة</string>
<string name="view_grid_compact">شبكة مدمجة</string>
<string name="view_carousel">عرض دائري</string>
<string name="view_carousel">دائري</string>
<string name="game_image_desc"> لقطة شاشة لـ%1$s</string>
<string name="folder">مجلد</string>
<string name="dont_show_again">عدم العرض مجددًا</string>
<string name="dont_show_again">لا تعرض مرة أخرى</string>
<string name="add_directory_success">تمت إضافة مجلد اللعبة الجديد بنجاح</string>
<string name="enable_update_checks">تحقق من وجود تحديثات عند بدء تشغيل التطبيق.</string>
<string name="update_available">تحديث متاح</string>
<string name="update_available_description">نسخة جديدة متاحة: %1$s\n\nهل ترغب في تنزيلها؟</string>
<string name="home_search">البحث</string>
<string name="home_settings">الإعدادات</string>
<string name="empty_gamelist">لم يتم العثور على ملفات أو لم يتم تحديد مجلد الألعاب حتى الآن.</string>
<string name="manage_game_folders">إدارة مجلدات اللعبة</string>
<string name="select_games_folder_description">يسمح لـ عدن بملء قائمة الألعاب</string>
<string name="select_games_folder_description">يسمح لـ Eden بملء قائمة الألعاب</string>
<string name="add_games_warning">تخطي تحديد مجلد الألعاب؟</string>
<string name="add_games_warning_description">لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد.</string>
<string name="add_games_warning_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-games</string>
@@ -277,14 +281,14 @@
<string name="install_prod_keys_warning">تخطي إضافة المفاتيح؟</string>
<string name="install_prod_keys_warning_description">يلزم وجود مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. لن تعمل سوى التطبيقات المحلية إذا واصلت.</string>
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
<string name="install_firmware_warning">تخطي إضافة الفريموير؟</string>
<string name="install_firmware_warning_description">العديد من الألعاب تتطلب الوصول إلى الفريموير لتشغيل بشكل صحيح.</string>
<string name="install_firmware_warning">تخطي إضافة الفيرموير؟</string>
<string name="install_firmware_warning_description">العديد من الألعاب تتطلب الوصول إلى الفيرموير لتشغيل بشكل صحيح.</string>
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
<string name="notifications">الإشعارات</string>
<string name="notifications_description">امنح إذن الإشعار باستخدام الزر أدناه</string>
<string name="notifications_description">امنح الإذن بالإشعار باستخدام الزر أدناه.</string>
<string name="give_permission">منح الإذن</string>
<string name="notification_warning">تخطي منح إذن الإشعارات؟</string>
<string name="notification_warning_description">لن تتمكن إيدن من إعلامك بالمعلومات المهمة.</string>
<string name="notification_warning_description">لن تتمكن Eden من إشعارك بالمعلومات المهمة.</string>
<string name="permission_denied">تم رفض الإذن</string>
<string name="permission_denied_description">لقد رفضت هذا الإذن عدة مرات ويتعين عليك الآن منحه يدويًا في إعدادات النظام</string>
<string name="about">حول</string>
@@ -295,18 +299,19 @@
<string name="warning_cancel">إلغاء</string>
<string name="install_amiibo_keys">تثبيت مفاتيح أميبو</string>
<string name="install_amiibo_keys_description">مطلوب لاستخدام أميبو في اللعبة</string>
<string name="gpu_driver_fetcher">جلب برامج تشغيل GPU</string>
<string name="gpu_driver_manager">GPU مدير برنامج تشغيل</string>
<string name="gpu_driver_fetcher">أداة جلب برامج تشغيل وحدة المعالجة الرسومية</string>
<string name="gpu_driver_manager">مدير برامج تشغيل وحدة معالجة الرسومات</string>
<string name="install_gpu_driver_description">تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل</string>
<string name="advanced_settings">إعدادات متقدمة</string>
<string name="settings_description">تكوين إعدادات المحاكي</string>
<string name="search_recently_played">تم تشغيلها مؤخرًا</string>
<string name="search_recently_added">أضيفت مؤخراً</string>
<string name="open_user_folder">فتح مجلد عدن</string>
<string name="open_user_folder_description">إدارة الملفات الداخلية لـ عدن</string>
<string name="open_user_folder">فتح مجلد Eden</string>
<string name="open_user_folder_description">إدارة الملفات الداخلية لـ Eden</string>
<string name="app_settings_description">تعديل سلوك ومظهر التطبيق</string>
<string name="no_file_manager">لم يتم العثور على مدير الملفات</string>
<string name="notification_no_directory_link">لا يمكن فتح مجلد عدن</string>
<string name="notification_no_directory_link_description">الرجاء تحديد موقع مجلد المستخدم باستخدام اللوحة الجانبية لمدير الملفات يدويًا</string>
<string name="notification_no_directory_link">لا يمكن فتح مجلد Eden</string>
<string name="notification_no_directory_link_description">يرجى تحديد موقع مجلد المستخدم يدويًا باستخدام اللوحة الجانبية لمدير الملفات.</string>
<string name="manage_save_data">إدارة حفظ البيانات</string>
<string name="manage_save_data_description">حفظ البيانات التي تم العثور عليها. يرجى اختيار أحد الخيارات التالية</string>
<string name="import_save_warning">استيراد حفظ البيانات</string>
@@ -315,20 +320,20 @@
<string name="save_files_exporting">جارٍ تصدير ملفات الحفظ...</string>
<string name="save_file_imported_success">تم الاستيراد بنجاح</string>
<string name="save_file_invalid_zip_structure">بنية مجلد الحفظ غير صالحة</string>
<string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو عنوان اللعبة.</string>
<string name="install_firmware">تثبيت فيرموير</string>
<string name="save_file_invalid_zip_structure_description">يجب أن يكون اسم المجلد الفرعي الأول هو معرف عنوان اللعبة.</string>
<string name="install_firmware">تثبيت الفيرموير</string>
<string name="install_firmware_description">يجب أن يكون فيرموير في أرشيف مضغوط وهو ضروري لتشغيل بعض الألعاب</string>
<string name="firmware_installing">تثبيت فيرموير</string>
<string name="firmware_installed_failure">فشل تثبيت فيرموير</string>
<string name="firmware_installed_failure_description">تأكد من أن ملفات الفريموير nca موجودة في جذر ملف zip وحاول مرة أخرى.</string>
<string name="firmware_uninstalled_failure">فشل إلغاء تثبيت الفريموير</string>
<string name="firmware_installing">تثبيت الفيرموير</string>
<string name="firmware_installed_failure">فشل تثبيت الفيرموير</string>
<string name="firmware_installed_failure_description">تأكد من أن ملفات الفيرموير nca موجودة في جذر ملف مضغوط وحاول مرة أخرى.</string>
<string name="firmware_uninstalled_failure">فشل إلغاء تثبيت الفيرموير</string>
<string name="share_log">مشاركة سجلات التصحيح</string>
<string name="share_log_description">مشاركة ملف سجل عدن لتصحيح المشكلات</string>
<string name="share_log_description">مشاركة ملف سجل Eden لتصحيح الأخطاء</string>
<string name="share_log_missing">لم يتم العثور على ملف السجل</string>
<string name="install_game_content">تثبيت محتوى اللعبة</string>
<string name="install_game_content_description">قم بتثبيت تحديثات اللعبة أو الإضافات</string>
<string name="install_game_content_description">تثبيت تحديثات اللعبة أو المحتوى القابل للتنزيل</string>
<string name="installing_game_content">جارٍ تثبيت المحتوى...</string>
<string name="install_game_content_failure">خطأ في تثبيت الملف(ات) على NAND</string>
<string name="install_game_content_failure">خطأ في تثبيت الملف(ات) على الذاكرة الداخلية</string>
<string name="install_game_content_failure_description">يرجى التأكد من صحة المحتوى (المحتويات) وتثبيت ملف prod.keys.</string>
<string name="install_game_content_failure_base">لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة.</string>
<string name="install_game_content_failed_count">%1$d حدث خطأ (أخطاء) في التثبيت </string>
@@ -338,7 +343,7 @@
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
<string name="custom_driver_not_supported">برامج التشغيل المخصصة غير مدعومة</string>
<string name="custom_driver_not_supported_description">تحميل برنامج التشغيل المخصص غير مدعوم حاليًا لهذا الجهاز. يُرجى إعادة تفعيل هذا الخيار لاحقًا للتحقق من إضافة الدعم.</string>
<string name="manage_yuzu_data">إدارة بيانات عدن</string>
<string name="manage_yuzu_data">إدارة بيانات Eden</string>
<string name="manage_yuzu_data_description">استيراد/تصدير فيرموير والمفاتيح وبيانات المستخدم والمزيد</string>
<string name="game_folders">مجلدات اللعبة</string>
<string name="deep_scan">فحص عميق</string>
@@ -363,16 +368,16 @@
</plurals>
<string name="no_save_data_found">لم يتم العثور على بيانات الحفظ</string>
<string name="verify_installed_content">التحقق من المحتوى المثبت</string>
<string name="verify_installed_content_description">فحص المحتوى المثبت بحثًا عن تلف</string>
<string name="verify_installed_content_description">فحص جميع المحتويات المثبتة للتأكد من عدم تلفها</string>
<string name="keys_missing">مفاتيح التشفير مفقودة</string>
<string name="keys_missing_description">لا يمكن فك تشفير الفريموير والألعاب</string>
<string name="keys_missing_description">لا يمكن فك تشفير الفيرموير والألعاب</string>
<string name="keys_missing_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys</string>
<string name="uninstall_firmware">إزالة الفريموير</string>
<string name="uninstall_firmware_description">سيؤدي إزالة الفريموير إلى حذفه من الجهاز وقد يؤثر على توافق الألعاب.</string>
<string name="firmware_uninstalling">إلغاء تثبيت الفريموير</string>
<string name="firmware_uninstalled_success">تم إزالة الفريموير بنجاح</string>
<string name="uninstall_firmware">إزالة الفيرموير</string>
<string name="uninstall_firmware_description">سيؤدي إزالة الفيرموير إلى حذفه من الجهاز وقد يؤثر على توافق الألعاب.</string>
<string name="firmware_uninstalling">إلغاء تثبيت الفيرموير</string>
<string name="firmware_uninstalled_success">تم إزالة الفيرموير بنجاح</string>
<string name="keys_failed">فشل تثبيت المفاتيح</string>
@@ -382,18 +387,18 @@
<string name="error_keys_failed_init">فشل تهيئة المفاتيح. تحقق من أن أدوات النسخ محدثة وأعد نسخ المفاتيح.</string>
<!-- Applet launcher strings -->
<string name="qlaunch_applet">Qlaunch</string>
<string name="qlaunch_applet">الشاشة الرئيسية</string>
<string name="qlaunch_description">تشغيل التطبيقات من الشاشة الرئيسية للنظام</string>
<string name="applets">قائمة التطبيقات المصغرة</string>
<string name="applets_description">تطبيقات نظام التشغيل باستخدام الفريموير المثبتة</string>
<string name="applets_error_firmware">الفريموير غير مثبت أو إصدار غير صالح</string>
<string name="applets_description">تطبيقات نظام التشغيل باستخدام الفيرموير المثبتة</string>
<string name="applets_error_firmware">الفيرموير غير مثبت أو إصدار غير صالح</string>
<string name="applets_error_applet">التطبيق المصغر غير متوفر</string>
<string name="applets_error_description"><![CDATA[يرجى التأكد من أن ملف <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> الخاص بك و <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">الفريموير</a> مثبتة وحاول مرة أخرى.<br>بالإضافة إلى ذلك، تأكد من أن الفريموير الخاص بك هو من الإصدار 19.0.1 أو أقدم.]]></string>
<string name="applets_error_description"><![CDATA[يرجى التأكد من أن ملف <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> الخاص بك و <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">الفيرموير</a> مثبتة وحاول مرة أخرى.<br>بالإضافة إلى ذلك، تأكد من أن الفيرموير الخاص بك هو من الإصدار 19.0.1 أو أقدم.]]></string>
<string name="album_applet">الألبوم</string>
<string name="album_applet_description">شاهد الصور المخزنة في مجلد لقطات شاشة المستخدم باستخدام عارض صور النظام</string>
<string name="album_applet_description">عرض الصور المخزنة في مجلد لقطات شاشة المستخدم باستخدام عارض صور النظام</string>
<string name="mii_edit_applet">تعديل Mii</string>
<string name="mii_edit_applet_description">عرض وتحرير Miis باستخدام محرر النظام</string>
<string name="cabinet_applet">خزانة</string>
<string name="cabinet_applet">الخزانة</string>
<string name="cabinet_applet_description">تعديل وحذف البيانات المخزنة على أميبو</string>
<string name="cabinet_launcher">مشغل الخزانة</string>
<string name="cabinet_nickname_and_owner">إعدادات الاسم المستعار والمالك</string>
@@ -404,26 +409,26 @@
<!-- About screen strings -->
<string name="gaia_is_not_real">Gaia غير حقيقي</string>
<string name="copied_to_clipboard">نسخ إلى الحافظة</string>
<string name="about_app_description">محاكي سويتش مفتوح المصدر</string>
<string name="about_app_description">محاكي Switch مفتوح المصدر</string>
<string name="contributors">المساهمين</string>
<string name="contributors_description">المساهمون الذين جعلوا عدن لنظام اندرويد ممكن</string>
<string name="contributors_description">المساهمون الذين جعلوا تطبيق Eden لنظام Android ممكناً</string>
<string name="contributors_link">https://git.eden-emu.dev/eden-emu/eden/activity/contributors</string>
<string name="licenses_description">المشاريع التي تجعل عدن لأجهزة أندرويد ممكنة</string>
<string name="licenses_description">المشاريع التي تجعل Eden لأجهزة Android ممكنة</string>
<string name="build">البناء</string>
<string name="user_data">بيانات المستخدم</string>
<string name="user_data_description">استيراد/تصدير جميع بيانات التطبيق.\nعند استيراد بيانات المستخدم، سيتم حذف جميع بيانات المستخدم الموجودة!\nقد يُسبب استيراد البيانات من Citron بعض المشاكل. يُنصح باستيراد جميع البيانات المطلوبة يدويًا.</string>
<string name="exporting_user_data">جارٍ تصدير بيانات المستخدم...</string>
<string name="importing_user_data">جارٍ استيراد بيانات المستخدم...</string>
<string name="invalid_yuzu_backup">نسخة احتياطية عدن غير صالحة</string>
<string name="invalid_yuzu_backup">نسخة احتياطية Eden غير صالحة</string>
<string name="user_data_export_success">تم تصدير بيانات المستخدم بنجاح</string>
<string name="user_data_import_success">تم استيراد بيانات المستخدم بنجاح</string>
<string name="user_data_export_cancelled">تم إلغاء التصدير</string>
<string name="user_data_import_failed_description">تأكد من أن مجلدات بيانات المستخدم موجودة في جذر مجلد zip وتحتوي على ملف تكوين في config/config.ini ثم حاول مرة أخرى.</string>
<string name="user_data_import_failed_description">تأكد من أن مجلدات بيانات المستخدم موجودة في جذر مجلد مضغوط وتحتوي على ملف تكوين في config/config.ini ثم حاول مرة أخرى.</string>
<!-- General settings strings -->
<string name="frame_limit_enable">الحد من السرعة</string>
<string name="frame_limit_enable_description">يحد من سرعة المحاكاة بنسبة محددة من السرعة العادية</string>
<string name="frame_limit_slider">الحد من السرعة في المئة</string>
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. 100% هي السرعة الطبيعية. ستؤدي القيم الأعلى أو الأدنى إلى زيادة أو تقليل حد السرعة.</string>
<string name="frame_limit_enable_description">يحدد سرعة المحاكاة بنسبة مئوية محددة من السرعة العادية.</string>
<string name="frame_limit_slider">نسبة الحد الأقصى للسرعة</string>
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. 100٪ هي السرعة العادية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة.</string>
<string name="cpu_backend">خلفية وحدة المعالجة المركزية</string>
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
<string name="value_with_units">%1$s%2$s</string>
@@ -431,7 +436,7 @@
<!-- System settings strings -->
<string name="device_name">اسم الجهاز</string>
<string name="use_docked_mode">وضع الإرساء</string>
<string name="use_docked_mode_description">زيادة الدقة، وانخفاض الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يؤدي إلى خفض الدقة وزيادة الأداء.</string>
<string name="use_docked_mode_description">يزيد الدقة ويقلل الأداء. يتم استخدام الوضع المحمول عند تعطيله، مما يقلل الدقة ويزيد الأداء.</string>
<string name="emulated_region">المنطقة التي تمت محاكاتها</string>
<string name="emulated_language">لغة المحاكاة</string>
<string name="select_rtc_date">حدد التاريخ و الساعة في الوقت الحقيقي</string>
@@ -446,56 +451,56 @@
<string name="web_token">رمز الويب</string>
<string name="web_token_description">رمز الويب المستخدم لإنشاء غرف عامة. وهو سلسلة من 48 حرفًا تحتوي فقط على أحرف صغيرة من a-z.</string>
<string name="web_username">اسم مستخدم الويب</string>
<string name="web_username_description">اسم المستخدم الذي سيظهر في قاعات اللعب الجماعي. يجب أن يتكون من 4 إلى 20 حرفًا، ويحتوي فقط على حروف أبجدية رقمية، وشرطات، ونقاط، وشرطة سفلية، ومسافات.</string>
<string name="web_username_description">اسم المستخدم الذي سيظهر في غرف الانتظار متعددة اللاعبين. يجب أن يتكون من 4 إلى 20 حرفًا، ويحتوي فقط على أحرف أبجدية رقمية وشرطات ونقاط وشرطات سفلية ومسافات.</string>
<string name="network">الشبكة</string>
<!-- Graphics settings strings -->
<string name="backend">الخلفية</string>
<string name="display">العرض</string>
<string name="display">الشاشة</string>
<string name="processing">المعالجة اللاحقة</string>
<string name="frame_skipping">قيد التطوير: تخطي الإطارات</string>
<string name="frame_skipping_description">تبديل تخطي الإطارات لتحسين الأداء عن طريق تقليل عدد الإطارات المعروضة. هذه الميزة قيد التطوير وسيتم تمكينها في الإصدارات المستقبلية.</string>
<string name="renderer_accuracy">مستوى الدقة</string>
<string name="renderer_resolution">(Handheld/Docked) الدقة</string>
<string name="renderer_resolution">الدقة (محمول/الإرساء)</string>
<string name="renderer_vsync">VSync وضع</string>
<string name="renderer_screen_layout">اتجاه العرض</string>
<string name="renderer_aspect_ratio">تناسب الابعاد</string>
<string name="renderer_scaling_filter">تصفية تكييف النافذة</string>
<string name="renderer_scaling_filter">مرشح ملائم للنافذة</string>
<string name="fsr_sharpness">حدة FSR</string>
<string name="fsr_sharpness_description">تحديد مدى حدة الصورة عند استخدام FSR</string>
<string name="fsr_sharpness_description">يحدد مدى وضوح الصورة عند استخدام التباين الديناميكي لـ FSR</string>
<string name="renderer_anti_aliasing">طريقة مكافحة التعرج</string>
<string name="renderer_force_max_clock">إجبار السرعة القصوى (لأجهزة Adreno فقط)</string>
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل في أقصى الساعات الممكنة (سيستمر تطبيق القيود الحرارية).</string>
<string name="renderer_optimize_spirv_output">تحسين Spir-V</string>
<string name="renderer_optimize_spirv_output_description">يحسن الشادر المترجم لزيادة كفاءة GPU.</string>
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
<string name="renderer_optimize_spirv_output">تحسين إخراج Spir-V</string>
<string name="renderer_optimize_spirv_output_description">يعمل على تحسين أداء برامج التظليل المجمعة لتحسين كفاءة وحدة معالجة الرسومات، ولكنه قد يؤدي إلى زيادة وقت التحميل وإبطاء السرعة في البداية.</string>
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
<string name="renderer_asynchronous_shaders_description">تجميع الظلال بشكل غير متزامن. قد يقلل هذا من التقطع ولكنه قد يتسبب أيضًا في حدوث أخطاء.</string>
<string name="use_fast_gpu_time">استخدام وقت GPU السريع</string>
<string name="use_fast_gpu_time_description">يجبر معظم الألعاب على العمل بأعلى دقة أصلية. هذا الخيار غير مثبت وقد يسبب مشاكل.</string>
<string name="fast_gpu_time">عامل زيادة سرعة GPU</string>
<string name="renderer_asynchronous_shaders_description">يقوم بتجميع التظليل بشكل غير متزامن. قد يقلل ذلك من التقطعات ولكنه قد يؤدي أيضًا إلى حدوث أخطاء.</string>
<string name="use_fast_gpu_time">استخدم وقت المعالج الرسومي السريع</string>
<string name="use_fast_gpu_time_description">يجبر معظم الألعاب على التشغيل بأعلى دقة أصلية لها. هذا الخيار غير آمن وقد يتسبب في مشاكل.</string>
<string name="fast_gpu_time">عامل زيادة تردد وحدة معالجة الرسوميات</string>
<string name="fast_gpu_time_description">استخدم 128 لأقصى أداء و512 لأقصى دقة رسومية.</string>
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
<string name="renderer_reactive_flushing_description">تحسين دقة العرض في بعض الألعاب على حساب الأداء</string>
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
<string name="use_disk_shader_cache">ذاكرة التخزين المؤقت للتظليل</string>
<string name="use_disk_shader_cache_description">يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا.</string>
<string name="anisotropic_filtering">تصفية متباينة الخواص</string>
<string name="anisotropic_filtering_description">تحسين جودة القوام عند الزوايا المائلة</string>
<string name="anisotropic_filtering_description">يحسن جودة الأنسجة عند عرضها بزوايا مائلة</string>
<string name="warning_resolution">تغيير دقة العرض إلى 2x أو أعلى قد يسبب مشاكل، وقد يؤدي إلى تباطؤ كبير في جهازك.</string>
<string name="warning_resolution">من المعروف أن تغيير الدقة إلى 2x أو أعلى يسبب مشاكل وقد يؤدي إلى إبطاء كبير في أداء جهازك.</string>
<!-- Debug settings strings -->
<string name="cpu">وحدة المعالج المركزية</string>
<string name="use_auto_stub">استخدم الملحق التلقائي</string>
<string name="use_auto_stub_description">يقوم تلقائيًا بإضافة خدمات ووظائف ناقصة. قد يحسن التوافق ولكنه قد يتسبب في تعطل المشغل ومشاكل في الاستقرار.</string>
<string name="use_auto_stub_description">استبدال الخدمات والوظائف المفقودة تلقائيًا. قد يؤدي ذلك إلى تحسين التوافق، ولكنه قد يتسبب في حدوث أعطال ومشكلات في الاستقرار.</string>
<string name="gpu">وحدة معالجة الرسومات</string>
<string name="renderer_api">واجهة برمجة التطبيقات</string>
<string name="renderer_debug">تصحيح الأخطاء الرسومية</string>
<string name="renderer_debug_description">يضبط واجهة برمجة تطبيقات الرسومات على وضع تصحيح الأخطاء البطيء.</string>
<string name="renderer_debug_description">يضبط واجهة برمجة التطبيقات الرسومية على وضع تصحيح الأخطاء البطيء.</string>
<string name="fastmem">Fastmem</string>
<string name="log">التسجيل</string>
<string name="log">تسجيل الدخول</string>
<string name="flush_by_line">تفريغ سجلات التصحيح حسب السطر</string>
<string name="flush_by_line_description">يفرغ سجلات التصحيح عند كتابة كل سطر، مما يجعل التصحيح أسهل في حالات التوقف أو التجميد.</string>
@@ -548,18 +553,18 @@
<string name="qualified_axis">Axis %1$s%2$s</string>
<string name="unused">غير مستخدم</string>
<string name="input_mapping_filter">مرشح تعيين الإدخال</string>
<string name="input_mapping_filter_description">اختر جهازًا لتصفية مدخلات الخرائط</string>
<string name="input_mapping_filter_description">حدد جهازًا لتصفية مدخلات التعيين</string>
<string name="auto_map">تعيين ذراع التحكم تلقائيًا</string>
<string name="auto_map_description">حدد جهازًا لمحاولة رسم الخرائط التلقائية</string>
<string name="auto_map_description">حدد جهازًا لمحاولة التعيين التلقائي</string>
<string name="attempted_auto_map">تم محاولة التعيين التلقائي باستخدام %1$s</string>
<string name="controller_type">نوع ذراع التحكم</string>
<string name="pro_controller">Pro Controller</string>
<string name="handheld">محمول</string>
<string name="dual_joycons">Dual Joycons</string>
<string name="left_joycon">Left Joycon</string>
<string name="right_joycon">Right Joycon</string>
<string name="dual_joycons">جوي كون ثنائي</string>
<string name="left_joycon">جوي كون اليسرى</string>
<string name="right_joycon">جوي كون اليمنى</string>
<string name="gamecube_controller">GameCube ذراع تحكم</string>
<string name="invert_axis">Invert axis</string>
<string name="invert_axis">عكس المحور</string>
<string name="invert_button">Invert button</string>
<string name="toggle_button">Toggle button</string>
<string name="turbo_button">Turbo button</string>
@@ -570,10 +575,10 @@
<string name="input_overlay">تراكب الإدخال</string>
<string name="vibration">الاهتزاز</string>
<string name="vibration_strength">قوة الاهتزاز</string>
<string name="profile">الملف الشخصي</string>
<string name="profile">ملف التعريف</string>
<string name="create_new_profile">إنشاء ملف تعريف جديد</string>
<string name="enter_profile_name">أدخل اسم الملف الشخصي</string>
<string name="profile_name_already_exists">اسم الملف الشخصي موجود بالفعل</string>
<string name="enter_profile_name">أدخل اسم ملف التعريف</string>
<string name="profile_name_already_exists">اسم ملف التعريف موجود بالفعل</string>
<string name="invalid_profile_name">اسم ملف التعريف غير صالح</string>
<string name="use_global_input_configuration">استخدام تكوين الإدخال العام</string>
<string name="player_num_profile">ملف تعريف%d اللاعب</string>
@@ -581,8 +586,8 @@
<string name="delete_input_profile_description">هل أنت متأكد من رغبتك في حذف ملف التعريف هذا؟ هذا غير قابل للاسترداد</string>
<string name="stick_map_description">حرك العصا إلى اليسار ثم للأعلى أو اضغط على زر</string>
<string name="button_map_description">اضغط على زر أو حرك الزناد/العصا</string>
<string name="map_dpad_direction">Map to D-Pad %1$s</string>
<string name="map_control">Map to %1$s</string>
<string name="map_dpad_direction">تعيين الأسهم %1$s</string>
<string name="map_control">تعيين %1$s</string>
<string name="failed_to_load_profile">فشل تحميل ملف التعريف</string>
<string name="failed_to_save_profile">فشل في حفظ ملف التعريف</string>
<string name="reset_mapping">إعادة تعيين التعيينات</string>
@@ -592,7 +597,7 @@
<string name="slider_default">افتراضي</string>
<string name="loading">جارٍ التحميل…</string>
<string name="shutting_down">جارٍ إيقاف التشغيل...</string>
<string name="reset_setting_confirmation">هل تريد إعادة تعيين هذا الإعداد مرة أخرى إلى قيمته الافتراضية؟</string>
<string name="reset_setting_confirmation">هل تريد إعادة ضبط هذا الإعداد إلى قيمته الافتراضية؟</string>
<string name="reset_to_default">إعادة التعيين إلى الوضع الافتراضي</string>
<string name="reset_to_default_description">إعادة تعيين جميع الإعدادات المتقدمة</string>
<string name="reset_all_settings">إعادة تعيين جميع الإعدادات؟</string>
@@ -607,7 +612,7 @@
<string name="export">تصدير</string>
<string name="export_failed">فشل التصدير</string>
<string name="import_failed">فشل الاستيراد</string>
<string name="cancelling">إلغاء</string>
<string name="cancelling">الإلغاء</string>
<string name="install">تثبيت</string>
<string name="fetch">جلب</string>
<string name="delete">حذف</string>
@@ -615,7 +620,7 @@
<string name="import_success">تم الاستيراد بنجاح</string>
<string name="export_success">تم التصدير بنجاح</string>
<string name="start">بدء</string>
<string name="global">عالمي</string>
<string name="global">المتغيرات العامة</string>
<string name="custom">مخصص</string>
<string name="import_complete">اكتمل الاستيراد</string>
<string name="use_global_setting">استخدام الإعداد العام</string>
@@ -628,15 +633,15 @@
<string name="select_gpu_driver_default">افتراضي</string>
<string name="select_gpu_driver_error">تم تحديد برنامج تشغيل غير صالح</string>
<string name="driver_already_installed">برنامج التشغيل مثبت بالفعل</string>
<string name="system_gpu_driver">تعريف معالج الرسومات الخاص بالنظام</string>
<string name="installing_driver">جارٍ تثبيت التعريف...</string>
<string name="system_gpu_driver">برنامج تشغيل وحدة معالجة الرسومات للنظام</string>
<string name="installing_driver">جارٍ تثبيت برنامج التشغيل…</string>
<!-- GPU driver fetcher -->
<string name="show_releases">عرض الإصدارات</string>
<string name="failed_to_fetch">فشل في الجلب</string>
<string name="error_during_fetch">خطأ أثناء الجلب</string>
<string name="show_downloads">عرض التحميلات</string>
<string name="hide_downloads">إخفاء التحميلات</string>
<string name="show_downloads">عرض التنزيلات</string>
<string name="hide_downloads">إخفاء التنزيلات</string>
<string name="failed_cache_dir">دليل الذاكرة المؤقتة غير متاح</string>
<string name="empty_response_body">نص الاستجابة فارغ</string>
<string name="successfully_installed">تم تثبيت %1$s بنجاح</string>
@@ -647,12 +652,12 @@
<string name="installing">جارٍ التثبيت...</string>
<string name="latest">الأحدث</string>
<string name="recommended_driver">برنامج التشغيل الموصى به:</string>
<string name="gpu_model">طراز GPU:</string>
<string name="unsupported_gpu">GPU غير مدعوم</string>
<string name="unsupported_gpu_warning">GPU الخاص بك لا يدعم حقن برنامج التشغيل. لا يُنصح بمحاولة تعيين برامج تشغيل مخصصة.</string>
<string name="gpu_model">طراز وحدة معالجة الرسومات:</string>
<string name="unsupported_gpu">بطاقة رسومات غير مدعومة</string>
<string name="unsupported_gpu_warning">لا تدعم وحدة معالجة الرسومات الخاصة بك إدخال برامج التشغيل. لا يُنصح بمحاولة تعيين برامج تشغيل مخصصة.</string>
<!-- Preferences Screen -->
<string name="preferences_settings">إعدادات</string>
<string name="preferences_settings">الإعدادات</string>
<string name="preferences_system">النظام</string>
<string name="preferences_system_description">وضع الإرساء ،المنطقة ،اللغة</string>
<string name="preferences_graphics">الرسومات</string>
@@ -670,7 +675,7 @@
<string name="info_description">معرف البرنامج، المطور، الإصدار</string>
<string name="per_game_settings">إعدادات خاصة للعبة</string>
<string name="per_game_settings_description">تعديل الإعدادات الخاصة بهذه اللعبة</string>
<string name="launch_options">تشغيل الإعدادات</string>
<string name="launch_options">تشغيل التكوين</string>
<string name="path">المسار</string>
<string name="program_id">معرف العنوان</string>
<string name="developer">المطور</string>
@@ -678,7 +683,6 @@
<string name="copy_details">نسخ التفاصيل</string>
<string name="add_ons">الإضافات</string>
<string name="add_ons_description">التعديلات والتحديثات والمحتوى القابل للتنزيل</string>
<string name="playtime">زمن اللعب:</string>
<string name="reset_playtime">مسح زمن اللعب</string>
<string name="reset_playtime_description">إعادة ضبط زمن اللعب الحالي للعبة إلى 0 ثانية</string>
<string name="reset_playtime_warning_description">سيؤدي هذا إلى مسح بيانات زمن اللعب الحالية للعبة. هل أنت متأكد؟</string>
@@ -700,22 +704,22 @@
<string name="delete_save_data">حذف حفظ البيانات</string>
<string name="delete_save_data_description">يزيل كافة البيانات المحفوظة الخاصة بهذه اللعبة</string>
<string name="delete_save_data_warning_description">يؤدي هذا إلى إزالة كافة البيانات المحفوظة لهذه اللعبة بشكل لا يمكن استرداده. هل أنت متأكد أنك تريد الاستمرار؟</string>
<string name="save_data_deleted_successfully">تم حذف تخزين اللعبة بنجاح</string>
<string name="save_data_deleted_successfully">تم حذف البيانات المحفوظة بنجاح</string>
<string name="select_content_type">نوع المحتوى</string>
<string name="updates_and_dlc">التحديثات والمحتوى القابل للتنزيل </string>
<string name="updates_and_dlc">التحديثات والمحتوى القابل للتنزيل</string>
<string name="mods_and_cheats">التعديلات والغش</string>
<string name="addon_notice">إشعار إضافي مهم</string>
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
<string name="addon_notice_description">لتثبيت التعديلات والغش، يجب عليك اختيار مجلد يحتوي على ملفات cheats/ أو romfs/ أو exefs/. لا يمكننا التأكد من توافق هذه الملفات مع لعبتك، لذا كن حذرًا!</string>
<string name="addon_notice_description">لتثبيت التعديلات والغش، يجب عليك تحديد مجلد يحتوي على دليل cheats/ أو romfs/ أو exefs/. لا يمكننا التحقق من توافق هذه الملفات مع لعبتك، لذا كن حذراً!</string>
<string name="invalid_directory">مجلد غير صالح</string>
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
<string name="invalid_directory_description">يرجى التأكد من أن الدليل الذي حددته يحتوي على مجلد cheats/ أو romfs/ أو exefs/ ثم حاول مرة أخرى.</string>
<string name="addon_installed_successfully">تم تثبيت الملحق بنجاح</string>
<string name="addon_installed_successfully">تم تثبيت الإضافة بنجاح</string>
<string name="verifying_content">جارٍ التحقق من المحتوى…</string>
<string name="content_install_notice">إشعار تثبيت المحتوى</string>
<string name="content_install_notice_description">المحتوى الذي اخترته لا يتوافق مع هذه اللعبة.\n هل ترغب في التثبيت على أي حال؟</string>
<string name="confirm_uninstall">تأكيد إلغاء التثبيت</string>
<string name="confirm_uninstall_description">هل أنت متأكد من أنك تريد إلغاء تثبيت هذا الملحق؟</string>
<string name="confirm_uninstall_description">هل أنت متأكد من أنك تريد إلغاء تثبيت هذا الإضافة؟</string>
<string name="verify_integrity">التحقق من السلامة</string>
<string name="verifying">جارٍ التحقق...</string>
<string name="verify_success">نجح التحقق من السلامة!</string>
@@ -730,15 +734,15 @@
<string name="share_config_failed">فشل مشاركة ملف الإعدادات</string>
<!-- ROM loading errors -->
<string name="loader_error_encrypted">الخاص بك ROM تم تشفير</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[يرجى اتباع الأدلة لإعادة نسخ <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">ألعاب البطاقات</a> أو <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">العناوين الرقمية</a>.]]></string>
<string name="loader_error_encrypted">ROM الخاص بك مشفر</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[يرجى اتباع الإرشادات لإعادة نسخ <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">بطاقات الألعاب </a> أو <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">الألعاب المثبتة</a>.]]></string>
<string name="loader_error_encrypted_keys_description"><![CDATA[تأكد من تثبيت <a href=\"https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a>]]></string>
<string name="loader_error_video_core">حدث خطأ أثناء تهيئة مركز الفيديو</string>
<string name="loader_error_video_core_description">قد يكون بسبب تعريف GPU غير متوافق</string>
<string name="loader_error_file_not_found">غير موجود ROM ملف</string>
<string name="loader_error_video_core">حدث خطأ أثناء تهيئة نواة الفيديو</string>
<string name="loader_error_video_core_description">عادةً ما يكون هذا ناتجًا عن برنامج تشغيل وحدة معالجة الرسومات غير متوافق. قد يؤدي تثبيت برنامج تشغيل مخصص لوحدة معالجة الرسومات إلى حل هذه المشكلة.</string>
<string name="loader_error_file_not_found">ملف ROM غير موجود</string>
<string name="loader_requires_firmware">اللعبة تتطلب فريموير</string>
<string name="loader_requires_firmware_description"><![CDATA[اللعبة التي تحاول تشغيلها تتطلب فريموير للتمهيد أو لتجاوز القائمة الافتتاحية. يرجى <a href=\"https://yuzu-mirror.github.io/help/quickstart\">نسخ وتثبيت فريموير</a>، أو اضغط \"موافق\" للمتابعة على أي حال.]]></string>
<string name="loader_requires_firmware">اللعبة تتطلب الفيرموير</string>
<string name="loader_requires_firmware_description"><![CDATA[اللعبة التي تحاول تشغيلها تتطلب الفيرموير للتمهيد أو لتجاوز القائمة الافتتاحية. يرجى <a href=\"https://yuzu-mirror.github.io/help/quickstart\">نسخ وتثبيت الفيرموير</a>، أو اضغط \"موافق\" للمتابعة على أي حال.]]></string>
<!-- Intent Launch strings -->
<string name="searching_for_game">جارٍ البحث عن اللعبة...</string>
@@ -747,20 +751,20 @@
<string name="custom_settings_failed_message">فشل تطبيق الإعدادات المخصصة لـ %1$s: %2$s</string>
<string name="launch_with_default_settings">التشغيل بالإعدادات الافتراضية</string>
<string name="launch_cancelled">تم إلغاء التشغيل</string>
<string name="custom_settings_failure_reasons">تعذر تطبيق الإعدادات المطلوبة. قد يكون ذلك بسبب فقدان برامج تشغيل GPU أو مشكلات في التكوين.</string>
<string name="custom_settings_failure_reasons">غير قادر على تطبيق الإعدادات المطلوبة. قد يكون ذلك بسبب نقص برامج تشغيل وحدة معالجة الرسوميات أو مشكلات في التكوين.</string>
<string name="custom_settings_applied">تم تطبيق الإعدادات المخصصة</string>
<string name="launching_game">جارٍ التشغيل %1$s...</string>
<string name="failed_to_initialize_game">فشل تهيئة اللعبة</string>
<string name="custom_intent_launch_message_with_settings">هل تريد تشغيل %1$s بالإعدادات المخصصة؟</string>
<string name="custom_intent_launch_message">هل تريد تشغيل %1$s؟</string>
<string name="failed_to_initialize_game">فشل في تهيئة اللعبة</string>
<string name="custom_intent_launch_message_with_settings">هل ترغب في التشغيل %1$s بإعدادات مخصصة؟</string>
<string name="custom_intent_launch_message">هل ترغب في التشغيل %1$s؟</string>
<string name="custom_intent_launch_title">تشغيل اللعبة</string>
<string name="launch">تشغيل</string>
<!-- Custom Config strings -->
<string name="config_write_failed">فشل كتابة ملف التهيئة</string>
<string name="config_apply_failed">فشل تطبيق التهيئة</string>
<string name="config_already_exists_title">التهيئة موجودة بالفعل</string>
<string name="config_already_exists_message">الإعدادات المخصصة موجودة بالفعل لـ \'%1$s\' .\n\nهل ترغب في استبدال التكوين الحالي؟\n\nلا يمكن التراجع عن هذا الإجراء.</string>
<string name="config_write_failed">فشل كتابة ملف التكوين</string>
<string name="config_apply_failed">فشل تطبيق التكوين</string>
<string name="config_already_exists_title">التكوين موجود بالفعل</string>
<string name="config_already_exists_message">توجد إعدادات مخصصة بالفعل لـ \'%1$s\' .\n\nهل ترغب في استبدال التكوين الحالي؟\n\nلا يمكن التراجع عن هذا الإجراء.</string>
<string name="config_exists_prompt">جارٍ التحقق من التكوين الحالي...</string>
<string name="overwrite_cancelled">تم إلغاء الاستبدال</string>
<string name="overwrite">استبدال</string>
@@ -768,7 +772,7 @@
<!-- Driver strings -->
<string name="driver_not_found">برنامج التشغيل المطلوب غير مثبت: %s</string>
<string name="invalid_driver_file">ملف برنامج تشغيل غير صالح: %s</string>
<string name="network_unavailable">لا يوجد اتصال بالشبكة. يرجى التحقق من اتصال الإنترنت والمحاولة مرة أخرى.</string>
<string name="network_unavailable">لا يوجد اتصال بالشبكة. يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.</string>
<string name="driver_missing_title">مطلوب برنامج تشغيل وحدة معالجة الرسومات</string>
<string name="driver_missing_message">يتطلب إعداد اللعبة برنامج تشغيل وحدة معالجة الرسومات \"\'%s\'\" وهو غير مُثبّت على جهازك.\n\nهل ترغب بتنزيله وتثبيته الآن؟</string>
<string name="driver_download_cancelled">تم إلغاء تنزيل برنامج التشغيل. لا يمكن تشغيل اللعبة بدون برنامج التشغيل المطلوب.</string>
@@ -777,9 +781,9 @@
<!-- Emulation Menu -->
<string name="emulation_exit">خروج من المحاكاة</string>
<string name="emulation_done">إنهاء</string>
<string name="emulation_toggle_controls">عناصر التحكم</string>
<string name="emulation_toggle_controls">تبديل عناصر التحكم</string>
<string name="emulation_rel_stick_center">مركز العصا النسبي</string>
<string name="emulation_dpad_slide">مزلاق الأسهم</string>
<string name="emulation_dpad_slide">انزلاق الأسهم</string>
<string name="emulation_haptics">الاهتزازات الديناميكية</string>
<string name="emulation_show_overlay">عرض ذراع التحكم</string>
<string name="emulation_hide_overlay">إخفاء ذراع التحكم</string>
@@ -797,7 +801,6 @@
<string name="unlock_drawer">فتح الدرج</string>
<string name="reset">إعادة الضبط</string>
<!-- Software keyboard -->
<string name="software_keyboard">لوحة المفاتيح البرمجية</string>
@@ -851,7 +854,7 @@
<string name="memory_exabyte">إكسابايت</string>
<!-- Renderer APIs -->
<string name="renderer_vulkan">فولكان</string>
<string name="renderer_vulkan">Vulkan</string>
<string name="renderer_none">لاشيء</string>
<!-- Renderer Accuracy -->
@@ -883,8 +886,8 @@
<string name="astc_recompression_bc3">BC3 (جودة متوسطة)</string>
<!-- ASTC Recompression Method Choices -->
<string name="vram_usage_mode">وضع استخدام VRAM</string>
<string name="vram_usage_mode_description">تحكم في مدى قوة المحاكي في تخصيص وتحرير ذاكرة GPU.</string>
<string name="vram_usage_mode">وضع استخدام ذاكرة VRAM</string>
<string name="vram_usage_mode_description">تحكم في مدى قوة تخصيص المحاكي لذاكرة وحدة معالجة الرسوميات وتحريرها.</string>
<string name="vram_usage_conservative">محافظ</string>
<string name="vram_usage_aggressive">عدواني</string>
@@ -902,7 +905,7 @@
<!-- Renderer VSync -->
<string name="renderer_vsync_immediate">Immediate (إيقاف)</string>
<string name="renderer_vsync_mailbox">Mailbox</string>
<string name="renderer_vsync_fifo">FIFO (On)</string>
<string name="renderer_vsync_fifo">FIFO (تشغيل)</string>
<string name="renderer_vsync_fifo_relaxed">FIFO Relaxed</string>
<!-- Scaling Filters -->
@@ -964,7 +967,10 @@
<!-- App options -->
<string name="change_app_theme">تغيير سمة التطبيق</string>
<string name="theme_default">افتراضي</string>
<string name="theme_material_you">Material You</string>
<string name="theme_material_you">ألوان ديناميكية</string>
<string name="app_settings">إعدادات التطبيق</string>
<string name="theme_and_color">السمة واللون</string>
<!-- Theme Modes -->
<string name="change_theme_mode">تغيير وضع السمة</string>
<string name="theme_mode_follow_system">اتبع النظام</string>
@@ -983,11 +989,11 @@
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">خلفيات سوداء</string>
<string name="use_black_backgrounds_description">عند استخدام المظهر الداكن، قم بتطبيق خلفيات سوداء.</string>
<string name="use_black_backgrounds_description">عند استخدام السمة الداكنة، قم بتطبيق خلفيات سوداء.</string>
<!-- Static Themes -->
<string name="static_theme_color">لون السمة</string>
<string name="eden_theme">عدن (افتراضي)</string>
<string name="eden_theme">Eden (افتراضي)</string>
<string name="violet">بنفسجي</string>
<string name="blue">أزرق</string>
<string name="cyan">سماوي</string>
@@ -1022,9 +1028,9 @@
<string name="swkbd_applet">لوحة المفاتيح البرمجية</string>
<string name="airplane_mode">وضع الطيران</string>
<string name="airplane_mode_description">تشغيل وضع الطيران على نظام التشغيل سويتش</string>
<string name="airplane_mode_description">تشغيل وضع الطيران في نظام التشغيل سويتش</string>
<!-- Licenses screen strings -->
<string name="licenses">التراخيص</string>
<string name="license_fidelityfx_fsr_description">AMD ترقية عالية الجودة من</string>
<string name="license_fidelityfx_fsr_description">تحسين الجودة بدرجة عالية من AMD</string>
</resources>
@@ -171,7 +171,7 @@
<string name="multiplayer_room_is_full">La sala está llena</string>
<string name="multiplayer_host_banned">Estás baneado de esta sala</string>
<string name="multiplayer_permission_denied">Permiso denegado</string>
<string name="multiplayer_no_such_user">Usuario no encontrado</string>
<string name="multiplayer_no_such_user">No hay tal usuario</string>
<string name="multiplayer_already_in_room">Ya estás en una sala</string>
<string name="multiplayer_create_room_error">Error al crear sala</string>
<string name="multiplayer_host_kicked">Anfitrión expulsado</string>
@@ -180,9 +180,9 @@
<string name="multiplayer_room_idle">Sala inactiva</string>
<string name="multiplayer_room_joining">Uniéndose a la sala</string>
<string name="multiplayer_room_joined">Sala unida</string>
<string name="multiplayer_room_moderator">Moderador de sala</string>
<string name="multiplayer_room_moderator">Moderador de la sala</string>
<string name="multiplayer_member_join">%1$s se ha unido</string>
<string name="multiplayer_member_leave">%1$s ha salido</string>
<string name="multiplayer_member_leave">%1$s se fue</string>
<string name="multiplayer_member_kicked">%1$s fue expulsado</string>
<string name="multiplayer_member_banned">%1$s fue baneado</string>
<string name="multiplayer_address_unbanned">Dirección desbaneada</string>
@@ -202,7 +202,7 @@
<string name="multiplayer_no_bans">No hay usuarios baneados</string>
<string name="multiplayer_unban_title">Desbanear usuario</string>
<string name="multiplayer_unban">Desbanear</string>
<string name="multiplayer_unban_message">¿Seguro que quieres desbanear a %1$s?</string>
<string name="multiplayer_unban_message">¿Estás seguro de que quieres desbanear a %1$s\?</string>
<string name="multiplayer_ban">Banear usuario</string>
<string name="multiplayer_room_browser">Salas públicas</string>
<string name="multiplayer_no_rooms_found">No se encontraron salas públicas</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Selecciona tu archivo <b>prod.keys</b> utilizando el botón de abajo.</string>
<string name="select_keys">Seleccionar las claves</string>
<string name="firmware">Firmware</string>
<string name="firmware_description">Seleccione su archivo <b> firmware.zip </b> con el botón de abajo.</string>
<string name="select_firmware">Seleccionar firmware</string>
<string name="games">Juegos</string>
<string name="games_description">Selecciona la carpeta <b>Juegos</b> utilizando el botón de abajo</string>
@@ -262,6 +263,9 @@
<string name="folder">Carpeta</string>
<string name="dont_show_again">No mostrar de nuevo</string>
<string name="add_directory_success">Nuevo directorio de juegos agregado exitosamente</string>
<string name="enable_update_checks">Busque actualizaciones al iniciar la aplicación.</string>
<string name="update_available">Actualización disponible</string>
<string name="update_available_description">Hay una nueva versión disponible: %1$s \n\n¿Quieres descargarla\?</string>
<string name="home_search">Buscar</string>
<string name="home_settings">Ajustes</string>
<string name="empty_gamelist">No se encontraron archivos o aún no se ha seleccionado ningún directorio de juego.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Añadido recientemente</string>
<string name="open_user_folder">Abrir la carpeta de Eden</string>
<string name="open_user_folder_description">Administrar los archivos internos de Eden</string>
<string name="app_settings_description">Modificar el comportamiento y la apariencia de la aplicación.</string>
<string name="no_file_manager">Explorador de archivos no encontrado</string>
<string name="notification_no_directory_link">No se pudo abrir la carpeta Eden</string>
<string name="notification_no_directory_link_description">Por favor, busque la carpeta user con el panel lateral del explorador de archivos de forma manual.</string>
@@ -672,7 +677,6 @@
<string name="copy_details">Copiar detalles</string>
<string name="add_ons">Extras/Add-ons</string>
<string name="add_ons_description">Activa/desactiva mods, actualizaciones y DLC</string>
<string name="playtime">Tiempo de juego:</string>
<string name="reset_playtime">Borrar tiempo de juego</string>
<string name="reset_playtime_description">Restablecer el tiempo de juego actual a 0 segundos</string>
<string name="reset_playtime_warning_description">Esto borrará los datos de tiempo de juego actual. ¿Estás seguro\?</string>
@@ -791,7 +795,6 @@
<string name="unlock_drawer">Desbloquear menú cajón</string>
<string name="reset">Reiniciar</string>
<!-- Software keyboard -->
<string name="software_keyboard">Teclado de software</string>
@@ -959,6 +962,9 @@
<string name="change_app_theme">Cambiar tema</string>
<string name="theme_default">Predeterminado</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Configuración de la aplicación</string>
<string name="theme_and_color">Tema y color</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Cambiar modo del tema</string>
<string name="theme_mode_follow_system">Igual al sistema</string>
@@ -112,7 +112,7 @@
<string name="use_sync_core">Synchroniser la vitesse du cœur</string>
<string name="use_sync_core_description">Synchronise la vitesse du cœur avec le pourcentage de vitesse maximal pour améliorer les performances sans modifier la vitesse réelle du jeu.</string>
<string name="use_lru_cache">Activer le cache LRU</string>
<string name="use_lru_cache_description">Active ou désactive le cache LRU pour améliorer les performances en réduisant l\'utilisation du processeur. Certains jeux comme TotK 1.2.1 ont des problèmes - désactivez-le si le jeu ne démarre pas ou plante aléatoirement.</string>
<string name="use_lru_cache_description">Active ou désactive le cache LRU (Least Recently Used) pour améliorer les performances en réduisant lutilisation du processeur. Certains jeux peuvent rencontrer des problèmes avec ce réglage ; désactivez-le si le jeu ne démarre pas ou plante de manière aléatoire.</string>
<string name="use_fast_cpu_time">Temps CPU rapide</string>
<string name="use_fast_cpu_time_description">Force le CPU émulé à fonctionner à une fréquence plus élevée, réduisant certains limiteurs de FPS. Cette option est instable et peut causer des problèmes, et les CPU plus faibles peuvent voir une baisse de performance.</string>
<string name="custom_cpu_ticks">Ticks CPU personnalisés</string>
@@ -125,7 +125,7 @@
<string name="fast_cpu_time">Fréquence CPU</string>
<string name="fast_cpu_time_description">Utilisez Boost (1700MHz) pour fonctionner à la fréquence native la plus élevée de la Switch, ou Fast (2000MHz) pour fonctionner à double fréquence.</string>
<string name="memory_layout">Disposition de la mémoire</string>
<string name="memory_layout_description">(EXPÉRIMENTAL) Change la disposition de la mémoire émulée. Ce paramètre n\'augmente pas les performances, mais peut aider les jeux utilisant des résolutions élevées via des mods. Ne pas utiliser sur les téléphones avec 8 Go de RAM ou moins.</string>
<string name="memory_layout_description">(EXPÉRIMENTAL) Modifie la disposition de la mémoire émulée.\nCe paramètre naméliore pas les performances, mais peut aider pour les jeux utilisant des résolutions élevées via des mods. Ne pas utiliser sur les téléphones avec 8 Go de RAM ou moins. Fonctionne uniquement avec le backend Dynarmic (JIT).</string>
<string name="dma_accuracy">Précision DMA</string>
<string name="dma_accuracy_description">Contrôle la précision du DMA. Une précision sûre peut résoudre les problèmes dans certains jeux, mais peut aussi affecter les performances dans certains cas. Si vous n\'êtes pas sûr, laissez ce paramètre sur Par défaut.</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Sélectionnez votre fichier &lt;b>prod.keys&lt;/b> avec le bouton ci-dessous.</string>
<string name="select_keys">Sélectionner les clés</string>
<string name="firmware">Firmware</string>
<string name="firmware_description">Sélectionnez votre fichier <b>firmware.zip</b> avec le bouton cidessous.</string>
<string name="select_firmware">Sélectionner le firmware</string>
<string name="games">Jeux</string>
<string name="games_description">Sélectionnez votre dossier &lt;b>de Jeux&lt;/b> avec le bouton ci-dessous.</string>
@@ -262,6 +263,9 @@
<string name="folder">Dossier</string>
<string name="dont_show_again">Ne plus afficher</string>
<string name="add_directory_success">Nouveau dossier de jeux ajouté</string>
<string name="enable_update_checks">Vérifier les mises à jour au démarrage de lapplication.</string>
<string name="update_available">Mise à jour disponible</string>
<string name="update_available_description">Une nouvelle version est disponible : %1$s\n\nVoulezvous la télécharger\?</string>
<string name="home_search">Rechercher</string>
<string name="home_settings">Paramètres</string>
<string name="empty_gamelist">Aucun fichier n\'a été trouvé ou aucun répertoire de jeu n\'a encore été sélectionné.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Ajouté récemment</string>
<string name="open_user_folder">Ouvrir le dossier de Eden</string>
<string name="open_user_folder_description">Gérer les fichiers internes de Eden</string>
<string name="app_settings_description">Modifier le comportement et lapparence de lapplication</string>
<string name="no_file_manager">Aucun gestionnaire de fichiers trouvé</string>
<string name="notification_no_directory_link">Impossible d\'ouvrir le répertoire de Eden</string>
<string name="notification_no_directory_link_description">Veuillez localiser manuellement le dossier utilisateur avec le panneau latéral du gestionnaire de fichiers.</string>
@@ -405,7 +410,7 @@
<string name="licenses_description">Des projets qui rendent possible Eden pour Android</string>
<string name="build">Build</string>
<string name="user_data">Données utilisateur</string>
<string name="user_data_description">Importer/exporter toutes les données de l\'application\nLors de l\'importation des données utilisateur, toutes les données déjà existantes seront supprimé !\nImporter les données depuis Citron peut poser des problèmes. Il est recommandé de faire l\'importation manuellement de toutes les données nécessaire.</string>
<string name="user_data_description">Importer/exporter toutes les données de l\'application\n\nLors de l\'importation des données utilisateur, toutes les données déjà existantes seront supprimé !\n\nImporter les données depuis Citron peut poser des problèmes. Il est recommandé de faire l\'importation manuellement de toutes les données nécessaire.</string>
<string name="exporting_user_data">Exportation des données utilisateur...</string>
<string name="importing_user_data">Importation des données utilisateur...</string>
<string name="invalid_yuzu_backup">Backup Eden invalide</string>
@@ -672,7 +677,6 @@
<string name="copy_details">Copier les détails</string>
<string name="add_ons">Extensions</string>
<string name="add_ons_description">Activer les mods, mises à jour et DLC</string>
<string name="playtime">Temps de jeu :</string>
<string name="reset_playtime">Réinitialiser le Temps de Jeu</string>
<string name="reset_playtime_description">Réinitialiser le temps de jeu du jeu actuel à 0 seconde</string>
<string name="reset_playtime_warning_description">Cela effacera les données de temps de jeu du jeu actuel. Êtes-vous sûr\?</string>
@@ -764,7 +768,7 @@
<string name="invalid_driver_file">Fichier de pilote invalide : %s</string>
<string name="network_unavailable">Aucune connexion réseau disponible. Veuillez vérifier votre connexion Internet et réessayer.</string>
<string name="driver_missing_title">Pilote GPU requis</string>
<string name="driver_missing_message">La configuration du jeu nécessite le pilote GPU \"%s\" qui n\'est pas installé sur votre appareil.\nVoulez-vous le télécharger et l\'installer maintenant \?</string>
<string name="driver_missing_message">La configuration du jeu nécessite le pilote GPU \"%s\" qui n\'est pas installé sur votre appareil.\n\nVoulez-vous le télécharger et l\'installer maintenant \?</string>
<string name="driver_download_cancelled">Téléchargement du pilote annulé. Le jeu ne peut pas être lancé sans le pilote requis.</string>
<string name="download">Télécharger</string>
@@ -791,7 +795,6 @@
<string name="unlock_drawer">Déverrouiller le tiroir</string>
<string name="reset">Réinitialiser</string>
<!-- Software keyboard -->
<string name="software_keyboard">Clavier virtuel</string>
@@ -959,6 +962,9 @@
<string name="change_app_theme">Changer le thème de l\'application</string>
<string name="theme_default">Par défaut</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Paramètres de lApp</string>
<string name="theme_and_color">Thème et Couleur</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Changer le mode de thème</string>
<string name="theme_mode_follow_system">Automatique</string>
@@ -769,7 +769,6 @@
<string name="unlock_drawer">Buka Kunci Laci</string>
<string name="reset">Reset</string>
<!-- Software keyboard -->
<string name="software_keyboard">Papan Ketik Perangkat Lunak</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Seleziona il tuo file &lt;b>prod.keys&lt;/b> con il pulsante in basso.</string>
<string name="select_keys">Seleziona le chiavi</string>
<string name="firmware">Firmware</string>
<string name="firmware_description">Seleziona il tuo file <b>firmware.zip</b>con il pulsante in basso.</string>
<string name="select_firmware">Seleziona Firmware</string>
<string name="games">Giochi</string>
<string name="games_description">Seleziona la cartella dei &lt;b>giochi&lt;/b> con il pulsante in basso.</string>
@@ -256,10 +257,15 @@
<string name="alphabetical">Alfabetico</string>
<string name="view_list">Lista</string>
<string name="view_grid">Griglia</string>
<string name="view_grid_compact">Griglia Compatta</string>
<string name="view_carousel">Carosello</string>
<string name="game_image_desc">Screenshot per %1$s</string>
<string name="folder">Cartella</string>
<string name="dont_show_again">Non mostrare più</string>
<string name="add_directory_success">Nuova directory di gioco aggiunta correttamente </string>
<string name="enable_update_checks">Controlla se è disponibile un aggiornamento quando avvii l\'app.</string>
<string name="update_available">Aggiornamento Disponibile</string>
<string name="update_available_description">Una nuova versione è disponibile:%1$s\n\nVuoi scaricarla\?</string>
<string name="home_search">Cerca</string>
<string name="home_settings">Impostazioni</string>
<string name="empty_gamelist">Non sono stati trovati file o non è stata ancora selezionata alcuna directory di gioco.</string>
@@ -274,6 +280,7 @@
<string name="install_prod_keys_description">Necessario per decrittografare i giochi</string>
<string name="install_prod_keys_warning">Saltare l\'aggiunta delle chiavi?</string>
<string name="install_prod_keys_warning_description">Sono necessarie delle chiavi valide per emulare i giochi. Se continui, funzioneranno solo le app homebrew.</string>
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
<string name="install_firmware_warning">Saltare l\'aggiunta del firmware?</string>
<string name="install_firmware_warning_description">Molti giochi richiedono l\'accesso al firmware per funzionare correttamente.</string>
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
@@ -301,6 +308,7 @@
<string name="search_recently_added">Aggiunti recentemente</string>
<string name="open_user_folder">Apri la cartella di Eden</string>
<string name="open_user_folder_description">Gestisci i file interni di Eden</string>
<string name="app_settings_description">Modifica il comportamento e l\'aspetto dell\'app</string>
<string name="no_file_manager">Nessun file manager trovato</string>
<string name="notification_no_directory_link">Impossibile aprire la cartella di Eden</string>
<string name="notification_no_directory_link_description">Per favore individua la cartella dell\'utente manualmente con il pannello laterale del file manager.</string>
@@ -318,6 +326,7 @@
<string name="firmware_installing">Installando il firmware</string>
<string name="firmware_installed_failure">L\'installazione del firmware è fallita</string>
<string name="firmware_installed_failure_description">Accertati che i file .nca del firmware siano contenuti direttamente nella radice dello .zip e riprova.</string>
<string name="firmware_uninstalled_failure">Disinstallazione del firmware fallita</string>
<string name="share_log">Condividi log di debug</string>
<string name="share_log_description">Condividi i log di Eden per ricevere supporto</string>
<string name="share_log_missing">Nessun file di log trovato</string>
@@ -331,7 +340,9 @@
<string name="install_game_content_success">Contenuto/i di gioco installato/i con successo.</string>
<string name="install_game_content_success_install">%1$dinstallato con successo.</string>
<string name="install_game_content_success_overwrite">%1$dsovrascritto con successo</string>
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
<string name="custom_driver_not_supported">I driver personalizzati non sono supportati.</string>
<string name="custom_driver_not_supported_description">I driver personalizzati non sono attualmente supportati per questo dispositivo.\nRicontrolla in futuro se il supporto è stato aggiunto.</string>
<string name="manage_yuzu_data">Gestisci i dati di Eden</string>
<string name="manage_yuzu_data_description">Importa/Esporta il firmware, le keys, i dati utente, e altro!</string>
<string name="game_folders">Cartelle di gioco</string>
@@ -355,6 +366,8 @@
<string name="keys_missing">Chiavi di crittografia mancanti</string>
<string name="keys_missing_description">Impossibile decifrare firmware e giochi retail</string>
<string name="keys_missing_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys</string>
<string name="uninstall_firmware">Disinstalla firmware</string>
<string name="uninstall_firmware_description">Disinstallare il firmware lo rimuoverà dal dispositivo e potrebbe influire sulla compatibilità dei giochi.</string>
<string name="firmware_uninstalling">Disinstallazione firmware...</string>
@@ -393,9 +406,11 @@
<string name="about_app_description">Un emulatore della Switch open-source.</string>
<string name="contributors">Collaboratori</string>
<string name="contributors_description">Realizzato con \u2764 dal team Eden</string>
<string name="contributors_link">https://git.eden-emu.dev/eden-emu/eden/activity/contributors</string>
<string name="licenses_description">Progetti che rendono Eden per Android possibile</string>
<string name="build">Compilazione</string>
<string name="user_data">Dati Utente</string>
<string name="user_data_description">Importa/Esporta tutti i dati dell\'app.\n\nQuando si importano nuovi dati utente, tutti quelli esistenti verranno cancellati!\n\nImportare dati da Citron può causare problemi. È raccomandato importare manualmente tutti i dati utili.</string>
<string name="exporting_user_data">Esportazione dei Dati Utente...</string>
<string name="importing_user_data">Importazione dei Dati Utente...</string>
<string name="invalid_yuzu_backup">Backup di Eden Invalido</string>
@@ -446,6 +461,8 @@
<string name="renderer_screen_layout">Orientamento</string>
<string name="renderer_aspect_ratio">Rapporto d\'aspetto: </string>
<string name="renderer_scaling_filter">Filtro adattivo della finestra </string>
<string name="fsr_sharpness">Nitidezza FSR</string>
<string name="fsr_sharpness_description">Determina quanto nitida dovrebbe essere l\'immagine utilizzando il Contrasto Dinamido dell\'FSR</string>
<string name="renderer_anti_aliasing">Metodo di anti-aliasing</string>
<string name="renderer_force_max_clock">Forza clock massimi (solo Adreno)</string>
<string name="renderer_force_max_clock_description">Forza la GPU a girare col massimo clock possibile (i vincoli alla temperatura saranno comunque applicati)</string>
@@ -486,6 +503,8 @@
<string name="audio_volume">Volume</string>
<string name="audio_volume_description">Specifica il volume dell\'audio in uscita.</string>
<!-- Input strings -->
<string name="buttons">Pulsanti</string>
<string name="button_a">A</string>
<string name="button_b">B</string>
<string name="button_x">X</string>
@@ -494,25 +513,45 @@
<string name="button_minus">Meno</string>
<string name="button_home">Home</string>
<string name="button_capture">Cattura</string>
<string name="start_pause">Avvia/Pausa</string>
<string name="dpad">D-Pad</string>
<string name="up">Su</string>
<string name="down">Giù</string>
<string name="left">Sinistra</string>
<string name="right">Destra</string>
<string name="left_stick">Analogico sinistro</string>
<string name="control_stick">Levetta di Controllo</string>
<string name="right_stick">Analogico destro</string>
<string name="c_stick">Levetta C</string>
<string name="pressed">Premuto</string>
<string name="range">Raggio</string>
<string name="deadzone">Zona morta</string>
<string name="modifier">Modificatore</string>
<string name="modifier_range">Range di modifica</string>
<string name="triggers">Grilletti</string>
<string name="button_l">L</string>
<string name="button_r">R</string>
<string name="button_zl">ZL</string>
<string name="button_zr">ZR</string>
<string name="button_sl_left">SL Sinistro</string>
<string name="button_sr_left">SR Sinistro</string>
<string name="button_sl_right">SL Destro</string>
<string name="button_sr_right">SR Destro</string>
<string name="button_z">Z</string>
<string name="invalid">Non valido</string>
<string name="not_set">Non impostato</string>
<string name="unknown">Sconosciuto</string>
<string name="qualified_hat">%1$s%2$s%3$sFreccia%4$s</string>
<string name="qualified_button_stick_axis">%1$s%2$s%3$sAsse%4$s</string>
<string name="qualified_button">%1$s%2$s%3$sPulsante%4$s</string>
<string name="qualified_axis">Asse%1$s%2$s</string>
<string name="unused">Inutilizzato</string>
<string name="input_mapping_filter">Filtro input mapping</string>
<string name="input_mapping_filter_description">Seleziona un dispositivo che faccia da filtro per l\'input mapping</string>
<string name="auto_map">Mappa in automatico un controller</string>
<string name="auto_map_description">Seleziona un dispositivo per provare ad auto-mapparlo</string>
<string name="attempted_auto_map">Auto-map eseguito con %1$s</string>
<string name="controller_type">Tipo controller</string>
<string name="pro_controller">Pro Controller</string>
<string name="handheld">Portatile</string>
<string name="dual_joycons">Due Joycon</string>
@@ -526,9 +565,28 @@
<string name="set_threshold">Imposta soglia</string>
<string name="toggle_axis">Cancella asse</string>
<string name="connected">Connesso</string>
<string name="use_system_vibrator">Use vibrazione di sistema</string>
<string name="input_overlay">Input overlay</string>
<string name="vibration">Vibrazione</string>
<string name="vibration_strength">Potenza vibrazione</string>
<string name="profile">Profilo</string>
<string name="create_new_profile">Crea nuovo profilo</string>
<string name="enter_profile_name">Inserisci nome profilo</string>
<string name="profile_name_already_exists">Un altro profilo con questo nome già esiste</string>
<string name="invalid_profile_name">Nome profilo invalido</string>
<string name="use_global_input_configuration">Usa la configurazione di input globale</string>
<string name="player_num_profile">Profilo %d giocatore</string>
<string name="delete_input_profile">Elimina profilo di input</string>
<string name="delete_input_profile_description">Sei sicuro di voler cancellare questo profilo\? Non potrai più recuperarlo.</string>
<string name="stick_map_description">Muovi un analogico a sinistra e poi sopra o premi un pulsante</string>
<string name="button_map_description">Premi un pulsante o muovi un grilletto/analogico</string>
<string name="map_dpad_direction">Map sulle frecce %1$s</string>
<string name="map_control">Mappa su %1$s</string>
<string name="failed_to_load_profile">Apertura del profilo fallita</string>
<string name="failed_to_save_profile">Salvataggio del profilo fallito</string>
<string name="reset_mapping">Resetta pulsanti</string>
<string name="reset_mapping_description">Sei sicuro di voler resettare tutti i pulsanti mappati per questo controller\? Questa azione non può essere annullata.</string>
<!-- Miscellaneous -->
<string name="slider_default">Predefinito</string>
<string name="loading">Caricamento…</string>
@@ -553,6 +611,7 @@
<string name="fetch">Recupera</string>
<string name="delete">Elimina</string>
<string name="edit">Modifica</string>
<string name="import_success">Importato correttamente</string>
<string name="export_success">Esportazione completata</string>
<string name="start">Start</string>
<string name="global">Globale</string>
@@ -560,6 +619,8 @@
<string name="import_complete">Importazione completata</string>
<string name="use_global_setting">Usa l\'impostazione globale</string>
<string name="operation_completed_successfully">Operazione completata con successo</string>
<string name="confirm">Conferma</string>
<string name="load">Carica</string>
<string name="save">Salva</string>
<!-- GPU driver installation -->
@@ -598,25 +659,74 @@
<string name="preferences_audio">Audio</string>
<string name="preferences_audio_description">Motore di Output audio e volume</string>
<string name="preferences_controls">Comandi</string>
<string name="preferences_controls_description">Mappa un imput del controllerq</string>
<string name="preferences_player">Giocatore %d</string>
<string name="preferences_debug">Debug</string>
<string name="preferences_debug_description">Debugging CPU/GPU, API grafiche, fastmem</string>
<!-- Game properties -->
<string name="info">Info</string>
<string name="info_description">ID Programma, Sviluppatore, Versione</string>
<string name="per_game_settings">Impostazioni specifiche per ogni gioco</string>
<string name="per_game_settings_description">Modifica le impostazioni solo per questo gioco</string>
<string name="launch_options">Avvia configurazione</string>
<string name="path">Percorso</string>
<string name="program_id">Id Programma</string>
<string name="developer">Sviluppatore</string>
<string name="version">Versione</string>
<string name="copy_details">Copia dettagli</string>
<string name="add_ons">Add-on</string>
<string name="add_ons_description">Gestisci mod, aggiornamenti e DLC</string>
<string name="reset_playtime">Resetta tempo di gioco</string>
<string name="reset_playtime_description">Resetta il tempo di gioco di quest\'ultimo a 0 secondi</string>
<string name="reset_playtime_warning_description">In questo modo resetterai il tempo di gioco di quest\'ultimo. Sei sicuro\?</string>
<string name="playtime_reset_successfully">Il tempo di gioco è stato resettato.</string>
<string name="edit_playtime">Modifica tempo di gioco</string>
<string name="hours">Ore</string>
<string name="minutes">Minuti</string>
<string name="hours_must_be_between_0_and_9999">Le ore devono essere comprese tra 0 e 9999</string>
<string name="minutes_must_be_between_0_and_59">I minuti devono essere compresi tra 0 e 59</string>
<string name="seconds_must_be_between_0_and_59">I secondi devono essere compresi tra 0 e 59</string>
<string name="playtime_updated_successfully">Tempo di gioco correttamente aggiornato</string>
<string name="clear_shader_cache">Rimuove la cache delle Shader</string>
<string name="clear_shader_cache_description">Cancella tutte le shader compilate su questo gioco fino ad ora</string>
<string name="clear_shader_cache_warning_description">Mentre la cache delle shader rigenera potresti imbatterti in stuttering</string>
<string name="cleared_shaders_successfully">Shader azzerate correttamente</string>
<string name="addons_game">Addons: %1$s</string>
<string name="save_data">Dati di salvataggio</string>
<string name="save_data_description">Gestisci i salvataggi di questo gioco</string>
<string name="delete_save_data">Elimina salvataggio</string>
<string name="delete_save_data_description">Cancella tutti i salvataggi per questo gioco</string>
<string name="delete_save_data_warning_description">Questo cancella completamente tutti i dati di salvataggio per questo gioco. Sei sicuro di voler continuare\?</string>
<string name="save_data_deleted_successfully">Salvataggi eliminati correttamente</string>
<string name="select_content_type">Tipo contenuto</string>
<string name="updates_and_dlc">Aggiornamenti e DLC</string>
<string name="mods_and_cheats">Mod e trucchi</string>
<string name="addon_notice">Avviso per gli addon importante</string>
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
<string name="addon_notice_description">Per installare mod e trucchi, devi selezionare una cartella che contenga una cartella chiamata \"cheats/\", \"romfs/\" oppure \"exefs/\". Non possiamo verificare se questi saranno compatibili con il gioco, quindi fai attenzione!</string>
<string name="invalid_directory">Cartella non valida</string>
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
<string name="invalid_directory_description">Per favore ricontrolla che la cartella che hai selezionato ne contenga una chiamata \"cheats/\", \"romfs/\" o \"exefs/\" e riprova.</string>
<string name="addon_installed_successfully">Addon installato correttamente</string>
<string name="verifying_content">Verificando contenuto...</string>
<string name="content_install_notice">Avviso installazione contenuto</string>
<string name="content_install_notice_description">Il contenuto che hai selezionato non corrisponde a questo gioco. Vuoi installare comunque\?</string>
<string name="confirm_uninstall">Conferma disinstallazione</string>
<string name="confirm_uninstall_description">Sei sicuro di voler cancellare quest\'addon\?</string>
<string name="verify_integrity">Verifica integrità</string>
<string name="verifying">Verificando...</string>
<string name="verify_success">Verifica dell\'integrità completata con successo!</string>
<string name="verify_failure">Verifica dell\'integrità fallita!</string>
<string name="verify_failure_description">I contenuti dei file potrebbero essere corrotti</string>
<string name="verify_no_result">Impossibile effettuare la verifica dell\'integrità</string>
<string name="verify_no_result_description">L\'integrità dei contenuti non è stata validata</string>
<string name="verification_failed_for">La verifica è fallita per i seguenti file: %1$s</string>
<string name="share_game_settings">Condividi configurazione</string>
<string name="import_config">Importa configurazione</string>
<string name="export_config">Esporta configurazione</string>
<string name="share_config_failed">Impossibile condividere il file</string>
<!-- ROM loading errors -->
<string name="loader_error_encrypted">La tua ROM è criptata</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[Segui le guide per ridumpare le tue <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">schede di gioco</a> o <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">titoli digitali</a>.]]></string>
@@ -648,6 +758,7 @@
<string name="config_write_failed">Impossibile scrivere il file di configurazione</string>
<string name="config_apply_failed">Impossibile applicare la configurazione</string>
<string name="config_already_exists_title">Configurazione già esistente</string>
<string name="config_already_exists_message">Impostazioni personalizzate già esistenti per %1$s.\n\nVuoi sovrascrivere la configurazione esistente\?\n\nQuesta azione non può essere annullata.</string>
<string name="config_exists_prompt">Verifica della configurazione esistente...</string>
<string name="overwrite_cancelled">Sovrascrittura annullata</string>
<string name="overwrite">Sovrascrivi</string>
@@ -657,6 +768,7 @@
<string name="invalid_driver_file">File driver non valido: %s</string>
<string name="network_unavailable">Nessuna connessione di rete disponibile. Controlla la connessione Internet e riprova.</string>
<string name="driver_missing_title">Driver GPU richiesto</string>
<string name="driver_missing_message">La configurazione del gioco richiede il driver GPU \"%s\" che non è installato sul tuo dispositivo.\n\nVuoi scaricarlo e installarlo ora\?</string>
<string name="driver_download_cancelled">Download del driver annullato. Il gioco non può essere avviato senza il driver richiesto.</string>
<string name="download">Scarica</string>
@@ -679,6 +791,10 @@
<string name="emulation_unpause">Riprendi l\'emulazione</string>
<string name="emulation_input_overlay">Opzioni overlay</string>
<string name="touchscreen">Touchscreen</string>
<string name="lock_drawer">Blocca drawer</string>
<string name="unlock_drawer">Sblocca drawer</string>
<string name="reset">Resetta</string>
<!-- Software keyboard -->
<string name="software_keyboard">Tastiera Software</string>
@@ -686,9 +802,12 @@
<string name="abort_button">Interrompi</string>
<string name="continue_button">Continua</string>
<string name="system_archive_not_found">Archivio di sistema non trovato</string>
<string name="system_archive_not_found_message">%s è mancante. Per favore esegui il dump degli archivi del tuo sistema.\nContinuare ad emulare potrebbe portare bug o causare crash.</string>
<string name="system_archive_general">Un archivio di sistema</string>
<string name="save_load_error">Errore di salvataggio/caricamento</string>
<string name="fatal_error">Errore Fatale</string>
<string name="fatal_error_message">Errore Fatale. Controlla i log per i dettagli.\nContinuare l\'emulazione potrebbe causare crash.</string>
<string name="device_memory_inadequate">RAM Totale:%1$s\nRaccomandati: %2$s</string>
<string name="memory_formatted">%1$s%2$s</string>
<string name="no_game_present">Non è presente alcun gioco avviabile.</string>
@@ -735,8 +854,13 @@
<!-- Renderer Accuracy -->
<string name="renderer_accuracy_normal">Normale</string>
<string name="renderer_accuracy_high">Alta</string>
<string name="renderer_accuracy_extreme">Estrema</string>
<!-- DMA Accuracy -->
<string name="dma_accuracy_default">Predefinito</string>
<string name="dma_accuracy_unsafe">Non sicura</string>
<string name="dma_accuracy_safe">Sicura</string>
<!-- ASTC Decoding Method -->
<string name="accelerate_astc">Metodo decodifica ASTC</string>
<string name="accelerate_astc_description">Scegli come decodificare le texture compresse ASTC per il rendering: CPU (lento, sicuro), GPU (veloce, consigliato) o CPU Async (senza stuttering, può causare problemi)</string>
@@ -766,6 +890,7 @@
<string name="resolution_half">0.5X (360p/540p)</string>
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
<string name="resolution_one">1X (720p/1080p)</string>
<string name="resolution_five_quarter">1.25X (900p/1350p)</string>
<string name="resolution_three_half">1.5X (1080p/1620p)</string>
<string name="resolution_two">2X (1440p/2160p) (Slow)</string>
<string name="resolution_three">3X (2160p/3240p) (Slow)</string>
@@ -781,9 +906,17 @@
<string name="scaling_filter_nearest_neighbor">Nearest neighbor</string>
<string name="scaling_filter_bilinear">Bilineare</string>
<string name="scaling_filter_bicubic">Bicubico</string>
<string name="scaling_filter_spline1">Spline-1</string>
<string name="scaling_filter_gaussian">Gaussiano</string>
<string name="scaling_filter_lanczos">Lanczos</string>
<string name="scaling_filter_scale_force">ScaleForce</string>
<string name="scaling_filter_fsr">AMD FidelityFX™️ Super Resolution</string>
<string name="scaling_filter_area">Area</string>
<string name="scaling_filter_zero_tangent">Zero-Tangent</string>
<string name="scaling_filter_bspline">B-Spline</string>
<string name="scaling_filter_mitchell">Mitchell</string>
<string name="scaling_filter_mmpx">MMPX</string>
<!-- Anti-Aliasing -->
<string name="anti_aliasing_none">Nessuna</string>
<string name="anti_aliasing_fxaa">FXAA</string>
@@ -791,8 +924,13 @@
<!-- Screen Layouts -->
<string name="screen_layout_auto">Automatico</string>
<string name="screen_layout_sensor_landscape">Layout orizzontale sensore</string>
<string name="screen_layout_landscape">Layout Orizzontale</string>
<string name="screen_layout_reverse_landscape">Layout orizzontale inverso sensore</string>
<string name="screen_layout_sensor_portrait">Layout verticale sensore</string>
<string name="screen_layout_portrait">Layout Verticale</string>
<string name="screen_layout_reverse_portrait">Layout verticale inverso</string>
<!-- Aspect Ratios -->
<string name="ratio_default">Predefinito (16:9)</string>
<string name="ratio_force_four_three">Forza 4:3</string>
@@ -800,10 +938,16 @@
<string name="ratio_force_sixteen_ten">Forza 16:10</string>
<string name="ratio_stretch">Adatta alla finestra</string>
<!-- CPU Backend -->
<string name="cpu_backend_dynarmic">Dynarmic (JIT)</string>
<string name="cpu_backend_nce">Native code execution (NCE)</string>
<!-- CPU Accuracy -->
<string name="cpu_accuracy_accurate">Accurata</string>
<string name="cpu_accuracy_unsafe">Non sicura</string>
<string name="cpu_accuracy_paranoid">Paranoico (Lento)</string>
<string name="cpu_accuracy_debugging">Debugging</string>
<!-- Gamepad Buttons -->
<string name="gamepad_d_pad">D-pad</string>
<string name="gamepad_left_stick">Analogico sinistro</string>
@@ -818,12 +962,17 @@
<string name="change_app_theme">Cambia tema dell\'app</string>
<string name="theme_default">Predefinito</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Impostazioni app</string>
<string name="theme_and_color">Tema e colore</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Cambia la modalità del tema</string>
<string name="theme_mode_follow_system">Segue il Sistema</string>
<string name="theme_mode_light">Chiaro</string>
<string name="theme_mode_dark">Scuro</string>
<!-- Audio output engines -->
<string name="oboe">oboe</string>
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
@@ -838,6 +987,7 @@
<!-- Static Themes -->
<string name="static_theme_color">Colore tema</string>
<string name="eden_theme">Eden (Default)</string>
<string name="violet">Viola (Predefinito)</string>
<string name="blue">Blu</string>
<string name="cyan">Ciano</string>
@@ -856,6 +1006,12 @@
<string name="mute">Silenzia</string>
<string name="unmute">Riattiva</string>
<!-- Emulation vertical alignment -->
<string name="vertical_alignment">Allineamento verticale</string>
<string name="top">In alto</string>
<string name="center">Centro</string>
<string name="bottom">In basso</string>
<!-- Applet Modes -->
<string name="applets_menu">Applet</string>
<string name="applets_menu_description">(In lavorazione) Cambia frontend e impostazioni degli applet</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Wybierz swoje klucze &lt;b>prod.keys&lt;/b> za pomocą przycisku poniżej.</string>
<string name="select_keys">Wybierz klucze</string>
<string name="firmware">Firmware</string>
<string name="firmware_description">Wybierz swój plik <b>firmware.zip</b> przyciskiem poniżej.</string>
<string name="select_firmware">Wybierz Firmware</string>
<string name="games">Gry</string>
<string name="games_description">Wybierz katalog z grami &lt;b>Games&lt;/b> za pomocą przycisku poniżej.</string>
@@ -262,6 +263,9 @@
<string name="folder">Folder</string>
<string name="dont_show_again">Nie pokazuj ponownie</string>
<string name="add_directory_success">Pomyślnie dodano nowy katalog gier</string>
<string name="enable_update_checks">Sprawdzaj aktualizacje przy uruchomieniu aplikacji.</string>
<string name="update_available">Dostępna aktualizacja</string>
<string name="update_available_description">Dostępna jest nowa wersja: %1$s\n\nCzy chcesz ją pobrać\?</string>
<string name="home_search">Szukaj</string>
<string name="home_settings">Ustawienia</string>
<string name="empty_gamelist">Nie znaleziono plików, lub nie wybrano jeszcze katalogu zawierającego gry.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Ostatnio dodane</string>
<string name="open_user_folder">Otwórz folder Eden</string>
<string name="open_user_folder_description">Zarządzaj plikami emulatora</string>
<string name="app_settings_description">Dostosuj działanie i wygląd aplikacji</string>
<string name="no_file_manager">Nie znaleziono menedżera plików</string>
<string name="notification_no_directory_link">Nie można otworzyć folderu emulatora</string>
<string name="notification_no_directory_link_description">Proszę wybrać ręcznie folder z pomocą panelu bocznego menedżera plików.</string>
@@ -674,7 +679,6 @@
<string name="copy_details">Kopiuj szczegóły</string>
<string name="add_ons">Dodatki</string>
<string name="add_ons_description">Przełącz mody, aktualizacje i DLC</string>
<string name="playtime">Czas gry:</string>
<string name="reset_playtime">Wyczyść czas gry</string>
<string name="reset_playtime_description">Zresetuj czas gry do 0 sekund.</string>
<string name="reset_playtime_warning_description">Spowoduje to usunięcie danych dotyczących czasu gry w bieżącej grze. Czy na pewno chcesz to zrobić\?</string>
@@ -793,7 +797,6 @@
<string name="unlock_drawer">Odblokuj panel</string>
<string name="reset">Resetuj</string>
<!-- Software keyboard -->
<string name="software_keyboard">Klawiatura programowa</string>
@@ -961,6 +964,9 @@
<string name="change_app_theme">Ustaw motyw aplikacji</string>
<string name="theme_default">Domyślny</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Ustawienia aplikacji</string>
<string name="theme_and_color">Motyw i kolor</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Zmień tryb motywu</string>
<string name="theme_mode_follow_system">Podążaj za systemowym</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Selecione seu arquivo &lt;b>prod.keys&lt;/b> com o botão abaixo.</string>
<string name="select_keys">Selecione as Chaves (Keys)</string>
<string name="firmware">Firmware</string>
<string name="firmware_description">Selecione seu arquivo <b>firmware.zip</b> com o botão abaixo.</string>
<string name="select_firmware">Selecionar Firmware</string>
<string name="games">Jogos</string>
<string name="games_description">Selecione sua pasta de <b>Jogos</b> com o botão abaixo.</string>
@@ -262,6 +263,9 @@
<string name="folder">Pasta</string>
<string name="dont_show_again">Não Mostrar Novamente</string>
<string name="add_directory_success">Nova pasta de jogos adicionada com sucesso</string>
<string name="enable_update_checks">Procurar por atualizações ao iniciar o aplicativo.</string>
<string name="update_available">Atualização Disponível</string>
<string name="update_available_description">Uma nova versão está disponível: %1$s\n\nGostaria de baixá-la\?</string>
<string name="home_search">Pesquisar</string>
<string name="home_settings">Configurações</string>
<string name="empty_gamelist">Nenhum jogo foi encontrado ou nenhuma pasta de jogos foi definida.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Adicionado recentemente</string>
<string name="open_user_folder">Abrir a pasta do Eden</string>
<string name="open_user_folder_description">Gerencie os arquivos internos do Eden</string>
<string name="app_settings_description">Alterar o comportamento e aparência do aplicativo</string>
<string name="no_file_manager">Nenhum gerenciador de arquivos encontrado</string>
<string name="notification_no_directory_link">Não foi possível abrir a pasta do Eden</string>
<string name="notification_no_directory_link_description">Localize manualmente a pasta do usuário usando o gerenciador de arquivos.</string>
@@ -673,7 +678,6 @@ uma tentativa de mapeamento automático</string>
<string name="copy_details">Copiar detalhes</string>
<string name="add_ons">Add-ons</string>
<string name="add_ons_description">Gerencie mods, atualizações e DLC</string>
<string name="playtime">Tempo de Jogo:</string>
<string name="reset_playtime">Limpar Tempo de Jogo</string>
<string name="reset_playtime_description">Resetar o contador de tempo do jogo atual</string>
<string name="reset_playtime_warning_description">Isso vai resetar os dados do contador de tempo do jogo atual. Tem certeza\?</string>
@@ -792,7 +796,6 @@ uma tentativa de mapeamento automático</string>
<string name="unlock_drawer">Desbloquear este menu</string>
<string name="reset">Redefinir</string>
<!-- Software keyboard -->
<string name="software_keyboard">Teclado do software</string>
@@ -960,6 +963,9 @@ uma tentativa de mapeamento automático</string>
<string name="change_app_theme">Mudar o tema do aplicativo</string>
<string name="theme_default">Padrão</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Configurações do App</string>
<string name="theme_and_color">Tema e Cores</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Alterar o tema</string>
<string name="theme_mode_follow_system">Igual ao Sistema</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Выберите ваш файл &lt;b>prod.keys&lt;/b> с помощью кнопки ниже.</string>
<string name="select_keys">Выбрать ключи</string>
<string name="firmware">Прошивка</string>
<string name="firmware_description">Выберете свой <b>firmware.zip</b>файл с кнопкой внизу.</string>
<string name="select_firmware">Выбрать прошивку</string>
<string name="games">Игры</string>
<string name="games_description">Выберите вашу папку с &lt;b>играми&lt;/b> с помощью кнопки ниже.</string>
@@ -262,6 +263,9 @@
<string name="folder">Папка</string>
<string name="dont_show_again">Не показывать снова</string>
<string name="add_directory_success">Новый каталог игр успешно добавлен</string>
<string name="enable_update_checks">Проверять наличия обновлений при запуске приложения.</string>
<string name="update_available">Обновление доступно</string>
<string name="update_available_description">Новая версия приложения доступна:%1$s\n\nНе хотите ли вы скачать его\?</string>
<string name="home_search">Поиск</string>
<string name="home_settings">Настройки</string>
<string name="empty_gamelist">Не найдены файлы или еще не выбрана папка с играми.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Недавно добавлено</string>
<string name="open_user_folder">Открыть папку Eden</string>
<string name="open_user_folder_description">Управление внутренними файлами Eden</string>
<string name="app_settings_description">Изменяет поведение и внешний вид приложения</string>
<string name="no_file_manager">Не найден файловый менеджер</string>
<string name="notification_no_directory_link">Не удалось открыть папку Eden</string>
<string name="notification_no_directory_link_description">Пожалуйста, найдите папку пользователя с помощью боковой панели файлового менеджера вручную.</string>
@@ -608,6 +613,7 @@
<string name="fetch">Получить</string>
<string name="delete">Удалить</string>
<string name="edit">Редактировать</string>
<string name="import_success">Успешно импортировано</string>
<string name="export_success">Экспорт успешно выполнен</string>
<string name="start">Запуск</string>
<string name="global">Глобальный</string>
@@ -673,6 +679,17 @@
<string name="copy_details">Копировать детали</string>
<string name="add_ons">Дополнения</string>
<string name="add_ons_description">Включение модов, обновлений и DLC</string>
<string name="reset_playtime">Очистить игровое время</string>
<string name="reset_playtime_description">Сбрасывает игровое время текущей игры обратно до 0 секунд</string>
<string name="reset_playtime_warning_description">Это очистит данные о игровом времени текущей игры. Вы уверены\?</string>
<string name="playtime_reset_successfully">Игровое время было сброшено</string>
<string name="edit_playtime">Изменить игровое время</string>
<string name="hours">Часы</string>
<string name="minutes">Минуты</string>
<string name="hours_must_be_between_0_and_9999">Количество часов должно быть от 0 до 9999</string>
<string name="minutes_must_be_between_0_and_59">Количество минут должно быть от 0 до 59</string>
<string name="seconds_must_be_between_0_and_59">Количество секунд должно быть от 0 до 59</string>
<string name="playtime_updated_successfully">Игровое время было обновлено</string>
<string name="clear_shader_cache">Очистить кэш шейдеров</string>
<string name="clear_shader_cache_description">Удаляет все шейдеры, созданные во время игры.</string>
<string name="clear_shader_cache_warning_description">У вас будет больше лагов во время повторной генерации кэша шейдеров</string>
@@ -707,6 +724,11 @@
<string name="verify_no_result">Проверка целостности не может быть выполнена</string>
<string name="verify_no_result_description">Файл не проверялся на корректность</string>
<string name="verification_failed_for">Проверку не удалась для следующих файлов:\n%1$s</string>
<string name="share_game_settings">Поделиться конфигом</string>
<string name="import_config">Импортировать конфиг</string>
<string name="export_config">Экспортировать конфиг</string>
<string name="share_config_failed">Не удалось Поделиться конфигом</string>
<!-- ROM loading errors -->
<string name="loader_error_encrypted">Ваш ROM зашифрованный</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[Пожалуйста, следуйте инструкциям по пересохранению <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">игровых картриджей</a> или <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">установленных игр</a>.]]></string>
@@ -775,7 +797,6 @@
<string name="unlock_drawer">Разморозить док</string>
<string name="reset">Сброс</string>
<!-- Software keyboard -->
<string name="software_keyboard">Виртуальная клавиатура</string>
@@ -871,6 +892,7 @@
<string name="resolution_half">0.5X (360p/540p)</string>
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
<string name="resolution_one">1X (720p/1080p)</string>
<string name="resolution_five_quarter">1.25X (900p/1350p)</string>
<string name="resolution_three_half">1.5X (1080p/1620p)</string>
<string name="resolution_two">2X (1440p/2160p) (Медленно)</string>
<string name="resolution_three">3X (2160p/3240p) (Медленно)</string>
@@ -892,6 +914,11 @@
<string name="scaling_filter_scale_force">ScaleForce</string>
<string name="scaling_filter_fsr">AMD FidelityFX™️ Super Resolution</string>
<string name="scaling_filter_area">Зона</string>
<string name="scaling_filter_zero_tangent">Zero-Tangent</string>
<string name="scaling_filter_bspline">B-Spline</string>
<string name="scaling_filter_mitchell">Mitchell</string>
<string name="scaling_filter_mmpx">MMPX</string>
<!-- Anti-Aliasing -->
<string name="anti_aliasing_none">Выкл.</string>
<string name="anti_aliasing_fxaa">FXAA</string>
@@ -921,6 +948,8 @@
<string name="cpu_accuracy_accurate">Точно</string>
<string name="cpu_accuracy_unsafe">Небезопасно</string>
<string name="cpu_accuracy_paranoid">Параноик</string>
<string name="cpu_accuracy_debugging">Отладка</string>
<!-- Gamepad Buttons -->
<string name="gamepad_d_pad">Крестовина</string>
<string name="gamepad_left_stick">Левый стик</string>
@@ -935,6 +964,9 @@
<string name="change_app_theme">Сменить тему</string>
<string name="theme_default">По умолчанию</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Настройки приложения</string>
<string name="theme_and_color">Тема и цвет</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Сменить режим темы</string>
<string name="theme_mode_follow_system">Системная</string>
@@ -240,6 +240,7 @@
<string name="keys_description">Виберіть ваш файл &lt;b>prod.keys&lt;/b> за допомогою кнопки нижче.</string>
<string name="select_keys">Вибрати ключі</string>
<string name="firmware">Прошивка</string>
<string name="firmware_description">Виберіть файл <b>firmware.zip</b> за допомогою кнопки нижче.</string>
<string name="select_firmware">Вибрати прошивку</string>
<string name="games">Ігри</string>
<string name="games_description">Виберіть вашу теку з &lt;b>іграми&lt;/b> за допомогою кнопки нижче.</string>
@@ -262,6 +263,9 @@
<string name="folder">Тека</string>
<string name="dont_show_again">Більше не показувати</string>
<string name="add_directory_success">Нову теку з іграми успішно додано</string>
<string name="enable_update_checks">Перевіряти оновлення при запуску застосунку.</string>
<string name="update_available">Доступне оновлення</string>
<string name="update_available_description">Доступна нова версія: %1$s\n\nХочете її завантажити\?</string>
<string name="home_search">Пошук</string>
<string name="home_settings">Налаштування</string>
<string name="empty_gamelist">Не знайдено файлів або ще не вибрано теку з іграми.</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">Нещодавно додано</string>
<string name="open_user_folder">Відкрити теку Eden</string>
<string name="open_user_folder_description">Керування внутрішніми файлами Eden</string>
<string name="app_settings_description">Змінити зовнішній вигляд і поведінку застосунку</string>
<string name="no_file_manager">Не знайдено файлового менеджера</string>
<string name="notification_no_directory_link">Не вдалося відкрити теку Eden</string>
<string name="notification_no_directory_link_description">Будь ласка, знайдіть теку користувача за допомогою бічної панелі файлового менеджера вручну.</string>
@@ -674,7 +679,6 @@
<string name="copy_details">Копіювати подробиці</string>
<string name="add_ons">Доповнення</string>
<string name="add_ons_description">Перемикати моди, оновлення та доповнення</string>
<string name="playtime">Награний час:</string>
<string name="reset_playtime">Очистити награний час</string>
<string name="reset_playtime_description">Скинути награний час поточної гри до 0 секунд</string>
<string name="reset_playtime_warning_description">Це очистить дані про награний час поточної гри. Ви впевнені\?</string>
@@ -793,7 +797,6 @@
<string name="unlock_drawer">Розблокувати панель</string>
<string name="reset">Скинути</string>
<!-- Software keyboard -->
<string name="software_keyboard">Програмна клавіатура</string>
@@ -961,6 +964,9 @@
<string name="change_app_theme">Змінити тему</string>
<string name="theme_default">За замовчуванням</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">Налаштування застосунку</string>
<string name="theme_and_color">Тема і колір</string>
<!-- Theme Modes -->
<string name="change_theme_mode">Змінити режим теми</string>
<string name="theme_mode_follow_system">Системна</string>
@@ -7,6 +7,25 @@
<string name="notification_permission_not_granted">未授予通知权限!</string>
<string name="app_notification_channel_description">Eden模拟器通知</string>
<string name="app_notification_running">Eden正在运行</string>
<string name="seconds"></string>
<!-- Spinbox strings -->
<string name="increment">增加</string>
<string name="decrement">减少</string>
<string name="value_too_low">值必须最小为 %1$d</string>
<string name="value_too_high">值最大必须为 %1$d</string>
<string name="invalid_value">无效的值</string>
<!-- Input Overlay -->
<string name="overlay_auto_hide">自动隐藏虚拟按键</string>
<string name="overlay_auto_hide_description">在指定的时间间隔后自动隐藏触摸控制覆盖层。</string>
<string name="enable_input_overlay_auto_hide">开启自动隐藏虚拟按键</string>
<string name="input_overlay_options">虚拟按键输入</string>
<string name="input_overlay_options_description">配置虚拟按键</string>
<!-- Stats Overlay settings -->
<string name="enhanced_fps_suffix">(增强)</string>
<string name="process_ram">进程内存: %1$d MB</string>
@@ -221,10 +240,12 @@
<string name="keys_description">使用下方的按钮来选择你的 &lt;b>prod.keys&lt;/b> 文件。</string>
<string name="select_keys">选择密钥文件</string>
<string name="firmware">固件</string>
<string name="firmware_description">请使用下面的按钮选择您的 <b>firmware.zip</b> 文件。</string>
<string name="select_firmware">选择固件</string>
<string name="games">游戏</string>
<string name="games_description">使用下方的按钮选择你的&lt;b>游戏&lt;/b>文件夹。</string>
<string name="done">完成</string>
<string name="done_description">你完成了全部设置。\n玩的开心!</string>
<string name="text_continue">继续</string>
<string name="next">下一步</string>
<string name="back">上一步</string>
@@ -236,10 +257,15 @@
<string name="alphabetical">字母顺序</string>
<string name="view_list">列表</string>
<string name="view_grid">网格</string>
<string name="view_grid_compact">紧凑网格</string>
<string name="view_carousel">轮播</string>
<string name="game_image_desc">为 %1$s 截图</string>
<string name="folder">文件夹</string>
<string name="dont_show_again">不再显示</string>
<string name="add_directory_success">游戏目录新增成功</string>
<string name="enable_update_checks">在 app 启动时检查更新。</string>
<string name="update_available">有可用更新</string>
<string name="update_available_description">有一个新版本可用: %1$s\n\n您要下载它吗\?</string>
<string name="home_search">搜索</string>
<string name="home_settings">设置</string>
<string name="empty_gamelist">找不到游戏,或者尚未选择游戏文件夹。</string>
@@ -247,14 +273,17 @@
<string name="select_games_folder_description">允许 Eden 更新游戏列表</string>
<string name="add_games_warning">跳过选择游戏文件夹?</string>
<string name="add_games_warning_description">如果未选择游戏文件夹,游戏将不会显示在游戏列表中。</string>
<string name="add_games_warning_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-games</string>
<string name="home_search_games">搜索游戏</string>
<string name="search_settings">搜索设置</string>
<string name="install_prod_keys">安装 prod.keys 文件</string>
<string name="install_prod_keys_description">需要密钥文件来解密游戏</string>
<string name="install_prod_keys_warning">跳过添加密钥文件?</string>
<string name="install_prod_keys_warning_description">对于商业游戏,需要有效的密钥文件才能运行。如果没有密钥文件,将只能运行自制软件。</string>
<string name="install_prod_keys_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
<string name="install_firmware_warning">跳过添加固件?</string>
<string name="install_firmware_warning_description">许多游戏需要访问固件才能正常运行。</string>
<string name="install_firmware_warning_help">https://yuzu-mirror.github.io/help/quickstart/#guide-introduction</string>
<string name="notifications">通知</string>
<string name="notifications_description">使用下方的按钮授予通知权限。</string>
<string name="give_permission">授予权限</string>
@@ -279,6 +308,7 @@
<string name="search_recently_added">最近添加</string>
<string name="open_user_folder">打开 Eden 文件夹</string>
<string name="open_user_folder_description">管理 Eden 内部文件</string>
<string name="app_settings_description">更改 app 的外观</string>
<string name="no_file_manager">找不到可用的文件管理器</string>
<string name="notification_no_directory_link">无法打开 Eden 文件夹</string>
<string name="notification_no_directory_link_description">请使用文件管理器侧边栏中的内部存储手动定位用户文件夹。</string>
@@ -310,7 +340,9 @@
<string name="install_game_content_success">游戏附加内容已成功安装</string>
<string name="install_game_content_success_install">%1$d 个包安装成功</string>
<string name="install_game_content_success_overwrite">%1$d 个包覆盖安装成功</string>
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
<string name="custom_driver_not_supported">不支持自定义驱动</string>
<string name="custom_driver_not_supported_description">此设备不支持自定义驱动。\n请之后再访问此项,查看是否已为此设备添加支持。</string>
<string name="manage_yuzu_data">管理 Eden 数据</string>
<string name="manage_yuzu_data_description">导入/导出固件、密钥、用户数据以及其他</string>
<string name="game_folders">游戏文件夹</string>
@@ -330,6 +362,8 @@
<string name="keys_missing">密钥缺失</string>
<string name="keys_missing_description">无法解密固件和商业游戏</string>
<string name="keys_missing_help">https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys</string>
<string name="uninstall_firmware">卸载固件</string>
<string name="uninstall_firmware_description">卸载固件将从设备中删除它并可能影响游戏兼容性。</string>
<string name="firmware_uninstalling">正在卸载固件...</string>
@@ -368,6 +402,7 @@
<string name="about_app_description">一款开源的 Switch 模拟器</string>
<string name="contributors">贡献者</string>
<string name="contributors_description">Eden 团队的用 \u2764 制作</string>
<string name="contributors_link">https://git.eden-emu.dev/eden-emu/eden/activity/contributors</string>
<string name="licenses_description">Android 版 Eden 离不开这些项目的支持</string>
<string name="build">构建版本</string>
<string name="user_data">用户数据</string>
@@ -572,6 +607,7 @@
<string name="fetch">获取</string>
<string name="delete">删除</string>
<string name="edit">编辑</string>
<string name="import_success">导入成功</string>
<string name="export_success">导出成功</string>
<string name="start">开始</string>
<string name="global">全局</string>
@@ -637,6 +673,17 @@
<string name="copy_details">复制明细</string>
<string name="add_ons">附加项</string>
<string name="add_ons_description">管理 mod、游戏更新及 DLC</string>
<string name="reset_playtime">清除游戏时间</string>
<string name="reset_playtime_description">将当前游戏的游戏时间重置为 0 秒</string>
<string name="reset_playtime_warning_description">者会讲出当前游戏的游戏时间数据。您确定吗\?</string>
<string name="playtime_reset_successfully">已重置游戏时间</string>
<string name="edit_playtime">编辑游戏时间</string>
<string name="hours">小时</string>
<string name="minutes">分钟</string>
<string name="hours_must_be_between_0_and_9999">小时必须为 0 到 9999 之间</string>
<string name="minutes_must_be_between_0_and_59">分钟必须为 0 到 59 之间</string>
<string name="seconds_must_be_between_0_and_59">秒必须为 0 到 59 之间</string>
<string name="playtime_updated_successfully">已成功更新游戏时间</string>
<string name="clear_shader_cache">清除着色器缓存</string>
<string name="clear_shader_cache_description">删除此游戏的所有着色器缓存</string>
<string name="clear_shader_cache_warning_description">由于着色器缓存需要重新生成,您将遇到更多卡顿</string>
@@ -660,6 +707,7 @@
<string name="addon_installed_successfully">附加项安装成功</string>
<string name="verifying_content">验证安装内容...</string>
<string name="content_install_notice">安装提醒</string>
<string name="content_install_notice_description">您选择安装的内容与此游戏不匹配。\n要继续安装吗?</string>
<string name="confirm_uninstall">卸载确认</string>
<string name="confirm_uninstall_description">您确定要卸载此附加项吗?</string>
<string name="verify_integrity">完整性验证</string>
@@ -669,6 +717,12 @@
<string name="verify_failure_description">文件可能已经损坏</string>
<string name="verify_no_result">无法执行完整性验证</string>
<string name="verify_no_result_description">未检查文件的完整性</string>
<string name="verification_failed_for">下列文件校验失败:\n%1$s</string>
<string name="share_game_settings">共享配置</string>
<string name="import_config">导入配置</string>
<string name="export_config">导出配置</string>
<string name="share_config_failed">共享配置文件失败</string>
<!-- ROM loading errors -->
<string name="loader_error_encrypted">您的 ROM 已加密</string>
<string name="loader_error_encrypted_roms_description"><![CDATA[请按照指南重新转储您的<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">游戏卡带</a>或<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">数字版游戏</a>。]]></string>
@@ -700,6 +754,7 @@
<string name="config_write_failed">无法写入配置文件</string>
<string name="config_apply_failed">无法应用配置</string>
<string name="config_already_exists_title">配置已存在</string>
<string name="config_already_exists_message">已存在 %1$s 的自定义设置。\n\n您要覆盖现存的配置文件吗\?\n\n此操作无法被撤销。</string>
<string name="config_exists_prompt">正在检查现有配置...</string>
<string name="overwrite_cancelled">覆盖已取消</string>
<string name="overwrite">覆盖</string>
@@ -709,6 +764,7 @@
<string name="invalid_driver_file">无效的驱动程序文件: %s</string>
<string name="network_unavailable">无可用网络连接。请检查您的互联网连接并重试。</string>
<string name="driver_missing_title">需要GPU驱动程序</string>
<string name="driver_missing_message">游戏配置所需的 GPU 驱动 \"%s\" 尚未安装到您的设备中。\n\n您要立即下载并安装吗\?</string>
<string name="driver_download_cancelled">驱动程序下载已取消。没有所需的驱动程序无法启动游戏。</string>
<string name="download">下载</string>
@@ -733,6 +789,8 @@
<string name="touchscreen">触摸屏</string>
<string name="lock_drawer">锁定侧边菜单</string>
<string name="unlock_drawer">解锁侧边菜单</string>
<string name="reset">重置</string>
<!-- Software keyboard -->
<string name="software_keyboard">软件键盘</string>
@@ -740,9 +798,11 @@
<string name="abort_button">中止</string>
<string name="continue_button">继续</string>
<string name="system_archive_not_found">未找到系统档案</string>
<string name="system_archive_not_found_message">%s 已丢失。请重新转储您的系统档案。\n继续模拟可能会导致崩溃。</string>
<string name="system_archive_general">系统档案</string>
<string name="save_load_error">保存/载入发生错误</string>
<string name="fatal_error">致命错误</string>
<string name="fatal_error_message">发生致命错误。请查阅日志获取详细信息。\n继续模拟可能会导致崩溃。</string>
<string name="device_memory_inadequate">设备RAM%1$s\n建议:%2$s</string>
<string name="memory_formatted">%1$s%2$s</string>
<string name="no_game_present">当前没有可启动的游戏!</string>
@@ -826,6 +886,7 @@
<string name="resolution_half">0.5X (360p/540p)</string>
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
<string name="resolution_one">1X (720p/1080p)</string>
<string name="resolution_five_quarter">1.25X (900p/1350p)</string>
<string name="resolution_three_half">1.5X (1080p/1620p)</string>
<string name="resolution_two">2X (1440p/2160p) (慢速)</string>
<string name="resolution_three">3X (2160p/3240p) (慢速)</string>
@@ -841,9 +902,17 @@
<string name="scaling_filter_nearest_neighbor">近邻取样</string>
<string name="scaling_filter_bilinear">双线性过滤</string>
<string name="scaling_filter_bicubic">双三线过滤</string>
<string name="scaling_filter_spline1">Spline-1</string>
<string name="scaling_filter_gaussian">高斯模糊</string>
<string name="scaling_filter_lanczos">Lanczos</string>
<string name="scaling_filter_scale_force">强制缩放</string>
<string name="scaling_filter_fsr">AMD FidelityFX™️ 超级分辨率锐画技术 (FSR)</string>
<string name="scaling_filter_area">区域</string>
<string name="scaling_filter_zero_tangent">零切线</string>
<string name="scaling_filter_bspline">B-Spline</string>
<string name="scaling_filter_mitchell">Mitchell</string>
<string name="scaling_filter_mmpx">MMPX</string>
<!-- Anti-Aliasing -->
<string name="anti_aliasing_none"></string>
<string name="anti_aliasing_fxaa">快速近似抗锯齿 (FXAA)</string>
@@ -873,6 +942,8 @@
<string name="cpu_accuracy_accurate">高精度</string>
<string name="cpu_accuracy_unsafe">低精度</string>
<string name="cpu_accuracy_paranoid">偏执模式</string>
<string name="cpu_accuracy_debugging">调试</string>
<!-- Gamepad Buttons -->
<string name="gamepad_d_pad">十字方向键</string>
<string name="gamepad_left_stick">左摇杆</string>
@@ -887,6 +958,9 @@
<string name="change_app_theme">切换主题</string>
<string name="theme_default">系统默认</string>
<string name="theme_material_you">Material You</string>
<string name="app_settings">App 设置</string>
<string name="theme_and_color">主题与颜色</string>
<!-- Theme Modes -->
<string name="change_theme_mode">更改主题模式</string>
<string name="theme_mode_follow_system">跟随系统</string>
@@ -909,6 +983,7 @@
<!-- Static Themes -->
<string name="static_theme_color">主题颜色</string>
<string name="eden_theme">Eden (默认)</string>
<string name="violet">紫色(默认)</string>
<string name="blue">蓝色</string>
<string name="cyan">青色</string>
@@ -22,7 +22,7 @@
<string name="overlay_auto_hide_description">在未使用虛擬按鍵幾秒後自動隱藏</string>
<string name="enable_input_overlay_auto_hide">啟用自動隱藏虛擬按鍵</string>
<string name="input_overlay_options">導入虛擬按鍵設定</string>
<string name="input_overlay_options">虛擬按鍵設定</string>
<string name="input_overlay_options_description">虛擬按鍵設定</string>
@@ -116,16 +116,16 @@
<string name="use_fast_cpu_time">快速 CPU 時間</string>
<string name="use_fast_cpu_time_description">強制模擬 CPU 以更高的時脈運行,減少某些 FPS 限制。此選項不穩定,可能會導致問題,較弱的 CPU 可能會看到效能下降。</string>
<string name="custom_cpu_ticks">自訂CPU時脈</string>
<string name="custom_cpu_ticks_description">設定自訂CPU時脈。更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000。</string>
<string name="custom_cpu_ticks_description">自訂CPU時脈。更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000。</string>
<string name="cpu_ticks">時脈</string>
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或崩潰。</string>
<string name="cpuopt_unsafe_host_mmu">啟用主機 MMU 模擬</string>
<string name="cpuopt_unsafe_host_mmu_description">此最佳化可加速來賓程式的記憶體存取。啟用後,來賓記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。</string>
<string name="fast_cpu_time">CPU 時鐘</string>
<string name="fast_cpu_time">CPU時脈</string>
<string name="fast_cpu_time_description">使用 Boost (1700MHz) 以 Switch 的最高原生時脈運行,或 Fast (2000MHz) 以雙倍時脈運行。</string>
<string name="memory_layout">記憶體佈局</string>
<string name="memory_layout_description">(實驗性)更改模擬記憶體佈局。此設定不會提高效能,但可能有助於透過模組使用高解析度的遊戲。不要在 RAM 為 8GB 或更少的手機上使用。</string>
<string name="memory_layout_description">(實驗性)更改模擬記憶體佈局。此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為 Dynarmic (JIT)</string>
<string name="dma_accuracy">DMA 準確度</string>
<string name="dma_accuracy_description">控制 DMA 準確度。安全準確度可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為「預設」。</string>
@@ -240,6 +240,7 @@
<string name="keys_description">使用下方的按鈕安裝您的 <b>prod.keys</b> 檔案。</string>
<string name="select_keys">選擇金鑰</string>
<string name="firmware">韌體</string>
<string name="firmware_description">使用下方按鈕安裝您的<b>firmware.zip</b>檔案</string>
<string name="select_firmware">選擇韌體</string>
<string name="games">遊戲</string>
<string name="games_description">使用下方的按鈕選擇您的<b>遊戲</b>資料夾。</string>
@@ -262,6 +263,9 @@
<string name="folder">資料夾</string>
<string name="dont_show_again">不再顯示</string>
<string name="add_directory_success">遊戲目錄新增成功</string>
<string name="enable_update_checks">在Eden啟動時檢查更新</string>
<string name="update_available">偵測到新版本</string>
<string name="update_available_description">有更新可供安裝:%1$s\n\n您要進行更新嗎?</string>
<string name="home_search">搜尋</string>
<string name="home_settings">設定</string>
<string name="empty_gamelist">找不到檔案,或者尚未選取遊戲目錄。</string>
@@ -304,6 +308,7 @@
<string name="search_recently_added">最近新增</string>
<string name="open_user_folder">開啟 Eden 資料夾</string>
<string name="open_user_folder_description">管理 Eden 的內部檔案</string>
<string name="app_settings_description">自訂Eden的主題與外觀</string>
<string name="no_file_manager">找不到檔案管理員</string>
<string name="notification_no_directory_link">無法開啟 Eden 目錄</string>
<string name="notification_no_directory_link_description">請使用檔案管理員的側邊面板手動定位到使用者資料夾。</string>
@@ -392,7 +397,7 @@
<string name="cabinet_formatter">格式化程式</string>
<!-- About screen strings -->
<string name="gaia_is_not_real">Gaia 不真實</string>
<string name="gaia_is_not_real">Gaia不是真的</string>
<string name="copied_to_clipboard">已複製到剪貼簿</string>
<string name="about_app_description">一個開放原始碼的 Switch 模擬器</string>
<string name="contributors">參與者</string>
@@ -401,7 +406,7 @@
<string name="licenses_description">這些專案使 Eden Android 版成為可能</string>
<string name="build">組建</string>
<string name="user_data">使用者資料</string>
<string name="user_data_description">導入/導出所有應用程式資料。\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n從 Citron 導入資料可能導致問題,建議手動導入所有所需資料。</string>
<string name="user_data_description">導入/導出所有應用程式資料。\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入資料可能會出現問題,建議手動導入所有所需資料。</string>
<string name="exporting_user_data">正在導出使用者資料…</string>
<string name="importing_user_data">正在導入使用者資料…</string>
<string name="invalid_yuzu_backup">無效的 Eden 備份</string>
@@ -518,7 +523,7 @@
<string name="range">靈敏度</string>
<string name="deadzone">無感帶</string>
<string name="modifier">用按鈕、按鍵來模擬搖桿</string>
<string name="modifier_range">修改按鈕模擬左搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑,數值越高代表使用的模擬值越大)</string>
<string name="modifier_range">修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大)</string>
<string name="triggers">肩部按鍵</string>
<string name="button_l">L</string>
<string name="button_r">R</string>
@@ -557,7 +562,7 @@
<string name="toggle_axis">視角反轉</string>
<string name="connected">已連線</string>
<string name="use_system_vibrator">使用系統震動器</string>
<string name="input_overlay">虛擬按鍵設定</string>
<string name="input_overlay">導入虛擬按鍵設定</string>
<string name="vibration">震動</string>
<string name="vibration_strength">震動強度</string>
<string name="profile">設定檔</string>
@@ -668,7 +673,6 @@
<string name="copy_details">複製詳細資料</string>
<string name="add_ons">附加元件</string>
<string name="add_ons_description">切換模組、更新及 DLC</string>
<string name="playtime">遊玩時間:</string>
<string name="reset_playtime">重設遊玩時間</string>
<string name="reset_playtime_description">將此遊戲的遊玩時間重設為0</string>
<string name="reset_playtime_warning_description">您確定要重設此遊戲的遊玩時間嗎?</string>
@@ -781,13 +785,12 @@
<string name="emulation_touch_overlay_edit">編輯虛擬按鍵</string>
<string name="emulation_pause">暫停模擬</string>
<string name="emulation_unpause">取消暫停模擬</string>
<string name="emulation_input_overlay">虛擬按鍵選項</string>
<string name="emulation_input_overlay">疊加層/虛擬按鍵設定</string>
<string name="touchscreen">觸控螢幕</string>
<string name="lock_drawer">鎖定側邊選單</string>
<string name="unlock_drawer">解鎖側邊選單</string>
<string name="reset">重設</string>
<!-- Software keyboard -->
<string name="software_keyboard">軟體鍵盤</string>
@@ -955,6 +958,9 @@
<string name="change_app_theme">變更應用程式主題</string>
<string name="theme_default">預設</string>
<string name="theme_material_you">質感設計3</string>
<string name="app_settings">Eden外觀設定</string>
<string name="theme_and_color">主題和顏色</string>
<!-- Theme Modes -->
<string name="change_theme_mode">變更主題模式</string>
<string name="theme_mode_follow_system">跟隨系統</string>
@@ -391,6 +391,61 @@
<item>2</item>
</integer-array>
<string-array name="appLanguageNames">
<item>@string/app_language_system</item>
<item>@string/app_language_english</item>
<item>@string/app_language_spanish</item>
<item>@string/app_language_french</item>
<item>@string/app_language_german</item>
<item>@string/app_language_italian</item>
<item>@string/app_language_portuguese</item>
<item>@string/app_language_brazilian_portuguese</item>
<item>@string/app_language_russian</item>
<item>@string/app_language_japanese</item>
<item>@string/app_language_korean</item>
<item>@string/app_language_simplified_chinese</item>
<item>@string/app_language_traditional_chinese</item>
<item>@string/app_language_polish</item>
<item>@string/app_language_czech</item>
<item>@string/app_language_norwegian</item>
<item>@string/app_language_hungarian</item>
<item>@string/app_language_ukrainian</item>
<item>@string/app_language_vietnamese</item>
<item>@string/app_language_indonesian</item>
<item>@string/app_language_arabic</item>
<item>@string/app_language_central_kurdish</item>
<item>@string/app_language_persian</item>
<item>@string/app_language_hebrew</item>
<item>@string/app_language_serbian</item>
</string-array>
<integer-array name="appLanguageValues">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
<item>11</item>
<item>12</item>
<item>13</item>
<item>14</item>
<item>15</item>
<item>16</item>
<item>17</item>
<item>18</item>
<item>19</item>
<item>20</item>
<item>21</item>
<item>22</item>
<item>23</item>
<item>24</item>
</integer-array>
<string-array name="outputEngineEntries">
<item>@string/auto</item>
<item>@string/oboe</item>
@@ -1028,6 +1028,35 @@
<string name="use_black_backgrounds">Black backgrounds</string>
<string name="use_black_backgrounds_description">When using the dark theme, apply black backgrounds.</string>
<!-- App Language -->
<string name="app_language">App Language</string>
<string name="app_language_description">Change the language of the app interface</string>
<string name="app_language_system">Follow System</string>
<string name="app_language_english">English</string>
<string name="app_language_spanish">Español</string>
<string name="app_language_french">Français</string>
<string name="app_language_german">Deutsch</string>
<string name="app_language_italian">Italiano</string>
<string name="app_language_portuguese">Português</string>
<string name="app_language_brazilian_portuguese">Português do Brasil</string>
<string name="app_language_russian">Русский</string>
<string name="app_language_japanese">日本語</string>
<string name="app_language_korean">한국어</string>
<string name="app_language_simplified_chinese">简体中文</string>
<string name="app_language_traditional_chinese">繁體中文</string>
<string name="app_language_polish">Polski</string>
<string name="app_language_czech">Čeština</string>
<string name="app_language_norwegian">Norsk bokmål</string>
<string name="app_language_hungarian">Magyar</string>
<string name="app_language_ukrainian">Українська</string>
<string name="app_language_vietnamese">Tiếng Việt</string>
<string name="app_language_indonesian">Bahasa Indonesia</string>
<string name="app_language_arabic">العربية</string>
<string name="app_language_central_kurdish">کوردیی ناوەندی</string>
<string name="app_language_persian">فارسی</string>
<string name="app_language_hebrew">עברית</string>
<string name="app_language_serbian">Српски</string>
<!-- Static Themes -->
<string name="static_theme_color">Theme Color</string>
<string name="eden_theme">Eden (Default)</string>
@@ -84,6 +84,7 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
const auto pow_10 = [](f32 val) -> f32 {
return (val >= 0.0f) ? 1.0f : (val <= -5.3f) ? 0.0f : std::pow(10.0f, val);
};
const auto cos = [](f32 degrees) -> f32 {
return std::cos(degrees * std::numbers::pi_v<f32> / 180.0f);
};
@@ -91,26 +92,39 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
static bool unk_initialized{false};
static Common::FixedPoint<50, 14> unk_value{};
const auto sample_rate{Common::FixedPoint<50, 14>::from_base(params.sample_rate)};
const auto pre_delay_time{Common::FixedPoint<50, 14>::from_base(params.pre_delay)};
auto sample_rate = Common::FixedPoint<50, 14>::from_base(params.sample_rate);
if (sample_rate.to_float() < 1.0f) sample_rate = Common::FixedPoint<50, 14>(1.0f);
auto pre_delay_time = Common::FixedPoint<50, 14>::from_base(params.pre_delay);
if (pre_delay_time.to_float() < 0.0f) pre_delay_time = Common::FixedPoint<50, 14>(0.0f);
for (u32 i = 0; i < ReverbInfo::MaxDelayTaps; i++) {
auto early_delay{
((pre_delay_time + EarlyDelayTimes[params.early_mode][i]) * sample_rate).to_int()};
early_delay = (std::min)(early_delay, state.pre_delay_line.sample_count_max);
state.early_delay_times[i] = early_delay + 1;
state.early_gains[i] = Common::FixedPoint<50, 14>::from_base(params.early_gain) *
EarlyDelayGains[params.early_mode][i];
int target_delay = ((pre_delay_time + EarlyDelayTimes[params.early_mode][i]) * sample_rate).to_int();
if (target_delay < 0) target_delay = 0;
if (target_delay > state.pre_delay_line.sample_count_max) target_delay = state.pre_delay_line.sample_count_max;
int old_delay = state.early_delay_times[i] - 1;
int smooth_delay = old_delay + (target_delay - old_delay) / 4;
state.early_delay_times[i] = smooth_delay + 1;
auto target_gain = Common::FixedPoint<50, 14>::from_base(params.early_gain) * EarlyDelayGains[params.early_mode][i];
if (target_gain.to_float() < 0.0f) target_gain = Common::FixedPoint<50, 14>(0.0f);
if (target_gain.to_float() > 1.0f) target_gain = Common::FixedPoint<50, 14>(1.0f);
state.early_gains[i] = state.early_gains[i] + (target_gain - state.early_gains[i]) / 4;
}
if (params.channel_count == 2) {
state.early_gains[4] * 0.5f;
state.early_gains[5] * 0.5f;
state.early_gains[4] *= Common::FixedPoint<50, 14>(0.5f);
state.early_gains[5] *= Common::FixedPoint<50, 14>(0.5f);
}
auto pre_time{
((pre_delay_time + EarlyDelayTimes[params.early_mode][10]) * sample_rate).to_int()};
state.pre_delay_time = (std::min)(pre_time, state.pre_delay_line.sample_count_max);
int target_pre_time = ((pre_delay_time + EarlyDelayTimes[params.early_mode][10]) * sample_rate).to_int();
if (target_pre_time < 0) target_pre_time = 0;
if (target_pre_time > state.pre_delay_line.sample_count_max) target_pre_time = state.pre_delay_line.sample_count_max;
int old_pre_time = state.pre_delay_time;
state.pre_delay_time = old_pre_time + (target_pre_time - old_pre_time) / 4;
if (!unk_initialized) {
unk_value = cos((1280.0f / sample_rate).to_float());
@@ -118,45 +132,64 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
}
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
const auto fdn_delay{(FdnDelayTimes[params.late_mode][i] * sample_rate).to_int()};
state.fdn_delay_lines[i].sample_count =
(std::min)(fdn_delay, state.fdn_delay_lines[i].sample_count_max);
state.fdn_delay_lines[i].buffer_end =
&state.fdn_delay_lines[i].buffer[state.fdn_delay_lines[i].sample_count - 1];
int target_fdn_delay = (FdnDelayTimes[params.late_mode][i] * sample_rate).to_int();
if (target_fdn_delay < 0) target_fdn_delay = 0;
if (target_fdn_delay > state.fdn_delay_lines[i].sample_count_max) target_fdn_delay = state.fdn_delay_lines[i].sample_count_max;
const auto decay_delay{(DecayDelayTimes[params.late_mode][i] * sample_rate).to_int()};
state.decay_delay_lines[i].sample_count =
(std::min)(decay_delay, state.decay_delay_lines[i].sample_count_max);
state.decay_delay_lines[i].buffer_end =
&state.decay_delay_lines[i].buffer[state.decay_delay_lines[i].sample_count - 1];
int old_fdn = state.fdn_delay_lines[i].sample_count;
state.fdn_delay_lines[i].sample_count = old_fdn + (target_fdn_delay - old_fdn) / 4;
state.fdn_delay_lines[i].buffer_end = &state.fdn_delay_lines[i].buffer[state.fdn_delay_lines[i].sample_count - 1];
state.decay_delay_lines[i].decay =
0.5999755859375f * (1.0f - Common::FixedPoint<50, 14>::from_base(params.colouration));
int target_decay_delay = (DecayDelayTimes[params.late_mode][i] * sample_rate).to_int();
if (target_decay_delay < 0) target_decay_delay = 0;
if (target_decay_delay > state.decay_delay_lines[i].sample_count_max) target_decay_delay = state.decay_delay_lines[i].sample_count_max;
auto a{(Common::FixedPoint<50, 14>(state.fdn_delay_lines[i].sample_count_max) +
state.decay_delay_lines[i].sample_count_max) *
-3};
auto b{a / (Common::FixedPoint<50, 14>::from_base(params.decay_time) * sample_rate)};
Common::FixedPoint<50, 14> c{0.0f};
Common::FixedPoint<50, 14> d{0.0f};
auto hf_decay_ratio{Common::FixedPoint<50, 14>::from_base(params.high_freq_decay_ratio)};
int old_decay = state.decay_delay_lines[i].sample_count;
state.decay_delay_lines[i].sample_count = old_decay + (target_decay_delay - old_decay) / 4;
state.decay_delay_lines[i].buffer_end = &state.decay_delay_lines[i].buffer[state.decay_delay_lines[i].sample_count - 1];
if (hf_decay_ratio > 0.99493408203125f) {
auto colouration = Common::FixedPoint<50, 14>::from_base(params.colouration);
if (colouration.to_float() < 0.0f) colouration = Common::FixedPoint<50, 14>(0.0f);
if (colouration.to_float() > 1.0f) colouration = Common::FixedPoint<50, 14>(1.0f);
state.decay_delay_lines[i].decay = state.decay_delay_lines[i].decay + (0.5999755859375f * (1.0f - colouration) - state.decay_delay_lines[i].decay) / 4;
auto decay_time_fp = Common::FixedPoint<50, 14>::from_base(params.decay_time);
if (decay_time_fp.to_float() <= 0.0f) decay_time_fp = Common::FixedPoint<50, 14>(0.0001f);
auto a = (Common::FixedPoint<50, 14>(state.fdn_delay_lines[i].sample_count_max) + state.decay_delay_lines[i].sample_count_max) * -3;
auto b = a / (decay_time_fp * sample_rate);
auto hf_decay_ratio = Common::FixedPoint<50, 14>::from_base(params.high_freq_decay_ratio);
if (hf_decay_ratio.to_float() < 0.001f) hf_decay_ratio = Common::FixedPoint<50, 14>(0.001f);
if (hf_decay_ratio.to_float() > 0.999f) hf_decay_ratio = Common::FixedPoint<50, 14>(0.999f);
Common::FixedPoint<50, 14> c{0.0f}, d{0.0f};
if (hf_decay_ratio.to_float() > 0.9949f) {
c = 0.0f;
d = 1.0f;
} else {
const auto e{
pow_10(((((1.0f / hf_decay_ratio) - 1.0f) * 2) / 100 * (b / 10)).to_float())};
const auto f{1.0f - e};
const auto g{2.0f - (unk_value * e * 2)};
const auto h{std::sqrt(std::pow(g.to_float(), 2.0f) - (std::pow(f, 2.0f) * 4))};
auto e = pow_10(((((1.0f / hf_decay_ratio.to_float()) - 1.0f) * 2) / 100 * (b / 10)).to_float());
if (e < 0.0001f) e = 0.0001f;
if (e > 1.0f) e = 1.0f;
auto f = 1.0f - e;
if (f < 0.0001f) f = 0.0001f;
auto g = 2.0f - (unk_value.to_float() * e * 2);
auto h_sq = g * g - f * f * 4;
if (h_sq < 0.0f) h_sq = 0.0f;
auto h = std::sqrt(h_sq);
c = (g - h) / (f * 2.0f);
d = 1.0f - c;
}
state.hf_decay_prev_gain[i] = c;
state.hf_decay_gain[i] = pow_10((b / 1000).to_float()) * d * 0.70709228515625f;
state.hf_decay_prev_gain[i] = state.hf_decay_prev_gain[i] + (c - state.hf_decay_prev_gain[i]) / 4;
state.hf_decay_gain[i] = state.hf_decay_gain[i] + (pow_10((b / 1000).to_float()) * d * 0.70709228515625f - state.hf_decay_gain[i]) / 4;
state.prev_feedback_output[i] = 0;
}
}
@@ -191,6 +224,8 @@ static void InitializeReverbEffect(const ReverbInfo::ParameterVersion2& params,
const auto center_delay_time{(5 * delay).to_uint_floor()};
state.center_delay_line.Initialize(center_delay_time, 1.0f);
UpdateReverbEffectParameter(params, state);
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
std::ranges::fill(state.fdn_delay_lines[i].buffer, 0);
std::ranges::fill(state.decay_delay_lines[i].buffer, 0);
+4 -4
View File
@@ -220,8 +220,8 @@ u64 SinkStream::GetExpectedPlayedSampleCount() {
auto time_delta{cur_time - last_sample_count_update_time};
auto exp_played_sample_count{min_played_sample_count + (TargetSampleRate * time_delta) / std::chrono::seconds{1}};
// Add 15ms of latency in sample reporting to allow for some leeway in scheduler timings
return std::min<u64>(exp_played_sample_count, max_played_sample_count) + TargetSampleCount * 3;
// Add 25ms of latency in sample reporting to allow for some leeway in scheduler timings
return std::min<u64>(exp_played_sample_count, max_played_sample_count) + TargetSampleCount * 5;
}
void SinkStream::WaitFreeSpace(std::stop_token stop_token) {
@@ -231,9 +231,9 @@ void SinkStream::WaitFreeSpace(std::stop_token stop_token) {
return paused || queued_buffers < max_queue_size;
};
release_cv.wait_for(lk, std::chrono::milliseconds(10), can_continue);
release_cv.wait_for(lk, std::chrono::milliseconds(7), can_continue);
if (queued_buffers > max_queue_size + 10) {
if (queued_buffers > max_queue_size + 3) {
release_cv.wait(lk, stop_token, can_continue);
}
}
+2
View File
@@ -257,6 +257,8 @@ else()
target_link_libraries(common PUBLIC Boost::headers)
endif()
target_link_libraries(common PUBLIC Boost::filesystem)
if (lz4_ADDED)
target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib)
endif()
+21 -7
View File
@@ -1,21 +1,35 @@
// SPDX-FileCopyrightText: Copyright 2025 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
#include "common/assert.h"
#include "common/common_funcs.h"
#include "common/logging/backend.h"
#include "common/settings.h"
void assert_fail_impl() {
#ifdef _MSC_VER
extern "C" {
__declspec(dllimport) void __stdcall DebugBreak(void);
}
#endif
void AssertFailSoftImpl() {
if (Settings::values.use_debug_asserts) {
Common::Log::Stop();
Crash();
#ifndef _MSC_VER
# if defined(ARCHITECTURE_x86_64)
__asm__ __volatile__("int $3");
# elif defined(ARCHITECTURE_arm64)
__asm__ __volatile__("brk #0");
# else
exit(1);
# endif
#else // POSIX ^^^ _MSC_VER vvv
DebugBreak();
#endif
}
}
[[noreturn]] void unreachable_impl() {
void AssertFatalImpl() {
Common::Log::Stop();
Crash();
throw std::runtime_error("Unreachable code");
std::abort();
}
+13 -10
View File
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2013 Dolphin Emulator Project
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -10,8 +13,8 @@
// However touching this file yields a global recompilation as this header is included almost
// everywhere. So let's just move the handling of the failed assert to a single cpp file.
void assert_fail_impl();
[[noreturn]] void unreachable_impl();
void AssertFailSoftImpl();
[[noreturn]] void AssertFatalImpl();
#ifdef _MSC_VER
#define YUZU_NO_INLINE __declspec(noinline)
@@ -22,29 +25,29 @@ void assert_fail_impl();
#define ASSERT(_a_) \
([&]() YUZU_NO_INLINE { \
if (!(_a_)) [[unlikely]] { \
LOG_CRITICAL(Debug, "Assertion Failed!"); \
assert_fail_impl(); \
LOG_CRITICAL(Debug, "Assert"); \
AssertFailSoftImpl(); \
} \
}())
#define ASSERT_MSG(_a_, ...) \
([&]() YUZU_NO_INLINE { \
if (!(_a_)) [[unlikely]] { \
LOG_CRITICAL(Debug, "Assertion Failed!\n" __VA_ARGS__); \
assert_fail_impl(); \
LOG_CRITICAL(Debug, "Assert\n" __VA_ARGS__); \
AssertFailSoftImpl(); \
} \
}())
#define UNREACHABLE() \
do { \
LOG_CRITICAL(Debug, "Unreachable code!"); \
unreachable_impl(); \
LOG_CRITICAL(Debug, "Unreachable"); \
AssertFatalImpl(); \
} while (0)
#define UNREACHABLE_MSG(...) \
do { \
LOG_CRITICAL(Debug, "Unreachable code!\n" __VA_ARGS__); \
unreachable_impl(); \
LOG_CRITICAL(Debug, "Unreachable\n" __VA_ARGS__); \
AssertFatalImpl(); \
} while (0)
#ifdef _DEBUG
+32 -15
View File
@@ -1,3 +1,6 @@
// 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
@@ -103,46 +106,60 @@ template <>
#else
// Some architectures lack u128, there is no definitive way to check them all without even more macro magic
// so let's just... do this; add your favourite arches once they get u128 support :)
#if (defined(__clang__) || defined(__GNUC__)) && (defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64))
using RealU128 = unsigned __int128;
# define SYNC_VAL_COMPARE_AND_SWAP(p, e, v) __sync_val_compare_and_swap(p, e, v)
# define SYNC_BOOL_COMPARE_AND_SWAP(p, e, v) __sync_bool_compare_and_swap(p, e, v)
# define U128_ZERO_INIT 0
#else
using RealU128 = u128;
# define SYNC_VAL_COMPARE_AND_SWAP(p, e, v) ((*p == e) ? *p = v : *p)
# define SYNC_BOOL_COMPARE_AND_SWAP(p, e, v) ((*p == e) ? (void)(*p = v) : (void)0), true
# define U128_ZERO_INIT {}
#endif
template <typename T>
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected) {
return __sync_bool_compare_and_swap(pointer, expected, value);
return SYNC_BOOL_COMPARE_AND_SWAP(pointer, expected, value);
}
[[nodiscard]] inline bool AtomicCompareAndSwap(u64* pointer, u128 value, u128 expected) {
unsigned __int128 value_a;
unsigned __int128 expected_a;
RealU128 value_a;
RealU128 expected_a;
std::memcpy(&value_a, value.data(), sizeof(u128));
std::memcpy(&expected_a, expected.data(), sizeof(u128));
return __sync_bool_compare_and_swap((unsigned __int128*)pointer, expected_a, value_a);
return SYNC_BOOL_COMPARE_AND_SWAP((RealU128*)pointer, expected_a, value_a);
}
template <typename T>
[[nodiscard]] inline bool AtomicCompareAndSwap(T* pointer, T value, T expected, T& actual) {
actual = __sync_val_compare_and_swap(pointer, expected, value);
actual = SYNC_VAL_COMPARE_AND_SWAP(pointer, expected, value);
return actual == expected;
}
[[nodiscard]] inline bool AtomicCompareAndSwap(u64* pointer, u128 value, u128 expected,
u128& actual) {
unsigned __int128 value_a;
unsigned __int128 expected_a;
unsigned __int128 actual_a;
[[nodiscard]] inline bool AtomicCompareAndSwap(u64* pointer, u128 value, u128 expected, u128& actual) {
RealU128 value_a;
RealU128 expected_a;
RealU128 actual_a;
std::memcpy(&value_a, value.data(), sizeof(u128));
std::memcpy(&expected_a, expected.data(), sizeof(u128));
actual_a = __sync_val_compare_and_swap((unsigned __int128*)pointer, expected_a, value_a);
actual_a = SYNC_VAL_COMPARE_AND_SWAP((RealU128*)pointer, expected_a, value_a);
std::memcpy(actual.data(), &actual_a, sizeof(u128));
return actual_a == expected_a;
}
[[nodiscard]] inline u128 AtomicLoad128(u64* pointer) {
unsigned __int128 zeros_a = 0;
unsigned __int128 result_a =
__sync_val_compare_and_swap((unsigned __int128*)pointer, zeros_a, zeros_a);
RealU128 zeros_a = U128_ZERO_INIT;
RealU128 result_a = SYNC_VAL_COMPARE_AND_SWAP((RealU128*)pointer, zeros_a, zeros_a);
u128 result;
std::memcpy(result.data(), &result_a, sizeof(u128));
return result;
}
#undef U128_ZERO_INIT
#undef SYNC_VAL_COMPARE_AND_SWAP
#undef SYNC_BOOL_COMPARE_AND_SWAP
#endif
+3 -21
View File
@@ -32,27 +32,9 @@
#define INSERT_PADDING_WORDS_NOINIT(num_words) \
[[maybe_unused]] std::array<u32, num_words> CONCAT2(pad, __LINE__)
#ifndef _MSC_VER
#if defined(ARCHITECTURE_x86_64)
#define Crash() __asm__ __volatile__("int $3")
#elif defined(ARCHITECTURE_arm64)
#define Crash() __asm__ __volatile__("brk #0")
#else
#define Crash() exit(1)
#endif
#else // _MSC_VER
// Locale Cross-Compatibility
#define locale_t _locale_t
extern "C" {
__declspec(dllimport) void __stdcall DebugBreak(void);
}
#define Crash() DebugBreak()
#endif // _MSC_VER ndef
#ifdef _MSC_VER
# define locale_t _locale_t // Locale Cross-Compatibility
#endif // _MSC_VER
#define DECLARE_ENUM_FLAG_OPERATORS(type) \
[[nodiscard]] constexpr type operator|(type a, type b) noexcept { \
+3 -20
View File
@@ -1,3 +1,6 @@
// 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
@@ -12,24 +15,4 @@ namespace Common {
template <typename T>
concept IsContiguousContainer = std::contiguous_iterator<typename T::iterator>;
// TODO: Replace with std::derived_from when the <concepts> header
// is available on all supported platforms.
template <typename Derived, typename Base>
concept DerivedFrom = requires {
std::is_base_of_v<Base, Derived>;
std::is_convertible_v<const volatile Derived*, const volatile Base*>;
};
// TODO: Replace with std::convertible_to when libc++ implements it.
template <typename From, typename To>
concept ConvertibleTo = std::is_convertible_v<From, To>;
// No equivalents in the stdlib
template <typename T>
concept IsArithmetic = std::is_arithmetic_v<T>;
template <typename T>
concept IsIntegral = std::is_integral_v<T>;
} // namespace Common
+11 -4
View File
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2015 Evan Teran
// SPDX-License-Identifier: MIT
@@ -16,6 +19,10 @@
namespace Common {
// No equivalent for "std::arithmetic" in the stdlib
template <typename T>
concept IsArithmetic = std::is_arithmetic_v<T>;
template <size_t I, size_t F>
class FixedPoint;
@@ -392,13 +399,13 @@ public: // binary math operators, effects underlying bit pattern since these
return *this;
}
template <IsIntegral Integer>
template <std::integral Integer>
constexpr FixedPoint& operator>>=(Integer n) {
data_ >>= n;
return *this;
}
template <IsIntegral Integer>
template <std::integral Integer>
constexpr FixedPoint& operator<<=(Integer n) {
data_ <<= n;
return *this;
@@ -587,12 +594,12 @@ constexpr FixedPoint<I, F> operator/(Number lhs, FixedPoint<I, F> rhs) {
}
// shift operators
template <size_t I, size_t F, IsIntegral Integer>
template <size_t I, size_t F, std::integral Integer>
constexpr FixedPoint<I, F> operator<<(FixedPoint<I, F> lhs, Integer rhs) {
lhs <<= rhs;
return lhs;
}
template <size_t I, size_t F, IsIntegral Integer>
template <size_t I, size_t F, std::integral Integer>
constexpr FixedPoint<I, F> operator>>(FixedPoint<I, F> lhs, Integer rhs) {
lhs >>= rhs;
return lhs;
+16 -3
View File
@@ -14,16 +14,29 @@ namespace fs = std::filesystem;
fs::path GetKvdbPath()
{
return GetLegacyPath(EmuPath::RyujinxDir) / "bis" / "system" / "save" / "8000000000000000" / "0"
return GetKvdbPath(GetLegacyPath(EmuPath::RyujinxDir));
}
fs::path GetKvdbPath(const fs::path& path) {
return path / "bis" / "system" / "save" / "8000000000000000" / "0"
/ "imkvdb.arc";
}
fs::path GetRyuPathFromSavePath(const fs::path& path) {
// This is a horrible hack, but I cba to find something better
return path.parent_path().parent_path().parent_path().parent_path().parent_path();
}
fs::path GetRyuSavePath(const u64 &save_id)
{
return GetRyuSavePath(GetLegacyPath(EmuPath::RyujinxDir), save_id);
}
std::filesystem::path GetRyuSavePath(const std::filesystem::path& path, const u64& save_id) {
std::string hex = fmt::format("{:016x}", save_id);
// TODO: what's the difference between 0 and 1?
return GetLegacyPath(EmuPath::RyujinxDir) / "bis" / "user" / "save" / hex / "0";
// TODO: what's the difference between 0 and 1?
return path / "bis" / "user" / "save" / hex / "0";
}
IMENReadResult ReadKvdb(const fs::path &path, std::vector<IMEN> &imens)
+6 -5
View File
@@ -7,16 +7,17 @@
#include <filesystem>
#include <vector>
namespace fs = std::filesystem;
namespace Common::FS {
constexpr const char IMEN_MAGIC[4] = {0x49, 0x4d, 0x45, 0x4e};
constexpr const char IMKV_MAGIC[4] = {0x49, 0x4d, 0x4b, 0x56};
constexpr const u8 IMEN_SIZE = 0x8c;
fs::path GetKvdbPath();
fs::path GetRyuSavePath(const u64 &program_id);
std::filesystem::path GetKvdbPath();
std::filesystem::path GetKvdbPath(const std::filesystem::path &path);
std::filesystem::path GetRyuPathFromSavePath(const std::filesystem::path &path);
std::filesystem::path GetRyuSavePath(const u64 &save_id);
std::filesystem::path GetRyuSavePath(const std::filesystem::path &path, const u64 &save_id);
enum class IMENReadResult {
Nonexistent, // ryujinx not found
@@ -35,6 +36,6 @@ struct IMEN
static_assert(sizeof(IMEN) == 0x10, "IMEN has incorrect size.");
IMENReadResult ReadKvdb(const fs::path &path, std::vector<IMEN> &imens);
IMENReadResult ReadKvdb(const std::filesystem::path &path, std::vector<IMEN> &imens);
} // namespace Common::FS
+26 -13
View File
@@ -4,10 +4,12 @@
#include "symlink.h"
#ifdef _WIN32
#include <windows.h>
#include <fmt/format.h>
#include <windows.h>
#endif
#include <boost/filesystem.hpp>
namespace fs = std::filesystem;
// The sole purpose of this file is to treat symlinks like symlinks on POSIX,
@@ -15,29 +17,40 @@ namespace fs = std::filesystem;
// This is because, for some inexplicable reason, Microsoft has locked symbolic
// links behind a "security policy", whereas directory junctions--functionally identical
// for directories, by the way--are not. Why? I don't know.
// And no, they do NOT provide a standard API for this (at least to my knowledge).
// CreateSymbolicLink, even when EXPLICITLY TOLD to create a junction, still fails
// because of their security policy.
// I don't know what kind of drugs the Windows developers have been on since NT started.
// Microsoft still has not implemented any of this in their std::filesystem implemenation,
// which ALSO means that it DOES NOT FOLLOW ANY DIRECTORY JUNCTIONS... AT ALL.
// Nor does any of their command line utilities or APIs. So you're quite literally
// on your own.
namespace Common::FS {
bool CreateSymlink(const fs::path &from, const fs::path &to)
bool CreateSymlink(fs::path from, fs::path to)
{
#ifdef _WIN32
const std::string command = fmt::format("mklink /J {} {}", to.string(), from.string());
return system(command.c_str()) == 0;
#else
from.make_preferred();
to.make_preferred();
std::error_code ec;
fs::create_directory_symlink(from, to, ec);
return !ec;
#ifdef _WIN32
if (ec) {
const std::string command = fmt::format("mklink /J \"{}\" \"{}\"",
to.string(),
from.string());
return system(command.c_str()) == 0;
}
#endif
return !ec;
}
bool IsSymlink(const fs::path &path)
{
#ifdef _WIN32
auto attributes = GetFileAttributesW(path.wstring().c_str());
return attributes & FILE_ATTRIBUTE_REPARSE_POINT;
#else
return fs::is_symlink(path);
#endif
return boost::filesystem::is_symlink(boost::filesystem::path{path});
}
} // namespace Common::FS
+1 -1
View File
@@ -6,7 +6,7 @@
#include <filesystem>
namespace Common::FS {
bool CreateSymlink(const std::filesystem::path &from, const std::filesystem::path &to);
bool CreateSymlink(std::filesystem::path from, std::filesystem::path to);
bool IsSymlink(const std::filesystem::path &path);
} // namespace Common::FS
+51 -28
View File
@@ -1,11 +1,10 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <fstream>
#include <vector>
#include "common/heap_tracker.h"
#include "common/logging/log.h"
#include "common/assert.h"
@@ -37,8 +36,6 @@ HeapTracker::~HeapTracker() = default;
void HeapTracker::Map(size_t virtual_offset, size_t host_offset, size_t length,
MemoryPermission perm, bool is_separate_heap) {
bool rebuild_required = false;
// When mapping other memory, map pages immediately.
if (!is_separate_heap) {
m_buffer.Map(virtual_offset, host_offset, length, perm, false);
@@ -60,29 +57,11 @@ void HeapTracker::Map(size_t virtual_offset, size_t host_offset, size_t length,
// Insert into mappings.
m_map_count++;
const auto it = m_mappings.insert(*map);
// Update tick before possible rebuild.
it->tick = m_tick++;
// Check if we need to rebuild.
if (m_resident_map_count >= m_max_resident_map_count) {
rebuild_required = true;
}
// Map the area.
m_buffer.Map(it->vaddr, it->paddr, it->size, it->perm, false);
// This map is now resident.
it->is_resident = true;
m_resident_map_count++;
m_resident_mappings.insert(*it);
m_mappings.insert(*map);
}
if (rebuild_required) {
// A rebuild was required, so perform it now.
this->RebuildSeparateHeapAddressSpace();
}
// Finally, map.
this->DeferredMapSeparateHeap(virtual_offset);
}
void HeapTracker::Unmap(size_t virtual_offset, size_t size, bool is_separate_heap) {
@@ -169,7 +148,6 @@ void HeapTracker::Protect(size_t virtual_offset, size_t size, MemoryPermission p
// Clamp to end.
next = (std::min)(next, end);
// Reprotect, if we need to.
if (should_protect) {
m_buffer.Protect(cur, next - cur, perm);
@@ -180,6 +158,51 @@ void HeapTracker::Protect(size_t virtual_offset, size_t size, MemoryPermission p
}
}
bool HeapTracker::DeferredMapSeparateHeap(u8* fault_address) {
if (m_buffer.IsInVirtualRange(fault_address)) {
return this->DeferredMapSeparateHeap(fault_address - m_buffer.VirtualBasePointer());
}
return false;
}
bool HeapTracker::DeferredMapSeparateHeap(size_t virtual_offset) {
bool rebuild_required = false;
{
std::scoped_lock lk{m_lock};
// Check to ensure this was a non-resident separate heap mapping.
const auto it = this->GetNearestHeapMapLocked(virtual_offset);
if (it == m_mappings.end() || it->is_resident) {
return false;
}
// Update tick before possible rebuild.
it->tick = m_tick++;
// Check if we need to rebuild.
if (m_resident_map_count > m_max_resident_map_count) {
rebuild_required = true;
}
// Map the area.
m_buffer.Map(it->vaddr, it->paddr, it->size, it->perm, false);
// This map is now resident.
it->is_resident = true;
m_resident_map_count++;
m_resident_mappings.insert(*it);
}
if (rebuild_required) {
// A rebuild was required, so perform it now.
this->RebuildSeparateHeapAddressSpace();
}
return true;
}
void HeapTracker::RebuildSeparateHeapAddressSpace() {
std::scoped_lock lk{m_rebuild_lock, m_lock};
@@ -190,8 +213,8 @@ void HeapTracker::RebuildSeparateHeapAddressSpace() {
// Despite being worse in theory, this has proven to be better in practice than more
// regularly dumping a smaller amount, because it significantly reduces average case
// lock contention.
const size_t desired_count = (std::min)(m_resident_map_count, m_max_resident_map_count) / 2;
const size_t evict_count = m_resident_map_count - desired_count;
std::size_t const desired_count = (std::min)(m_resident_map_count, m_max_resident_map_count) / 2;
std::size_t const evict_count = m_resident_map_count - desired_count;
auto it = m_resident_mappings.begin();
for (size_t i = 0; i < evict_count && it != m_resident_mappings.end(); i++) {
+42 -25
View File
@@ -521,14 +521,29 @@ public:
#else
fd = memfd_create("HostMemory", 0);
#endif
ASSERT_MSG(fd >= 0, "memfd_create failed: {}", strerror(errno));
// Defined to extend the file with zeros
int ret = ftruncate(fd, backing_size);
ASSERT_MSG(ret == 0, "ftruncate failed with {}, are you out-of-memory?", strerror(errno));
backing_base = static_cast<u8*>(
mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
bool use_anon = false;
if (fd <= 0) {
LOG_WARNING(Common_Memory, "memfd_create: {}", strerror(errno));
use_anon = true;
}
if (!use_anon) {
// Defined to extend the file with zeros
int ret = ftruncate(fd, backing_size);
if (ret != 0) {
LOG_WARNING(Common_Memory, "ftruncate: {} (likely out-of-emory)", strerror(errno));
use_anon = true;
}
}
if (use_anon) {
LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones");
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
if (fd > 0) {
fd = -1;
close(fd);
}
} else {
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
}
ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno));
// Virtual memory initialization
@@ -552,22 +567,18 @@ public:
free_manager.AllocateBlock(virtual_base + virtual_offset, length);
// Deduce mapping protection flags.
int flags = PROT_NONE;
if (True(perms & MemoryPermission::Read)) {
flags |= PROT_READ;
}
if (True(perms & MemoryPermission::Write)) {
flags |= PROT_WRITE;
}
int prot_flags = PROT_NONE;
if (True(perms & MemoryPermission::Read))
prot_flags |= PROT_READ;
if (True(perms & MemoryPermission::Write))
prot_flags |= PROT_WRITE;
#ifdef ARCHITECTURE_arm64
if (True(perms & MemoryPermission::Execute)) {
flags |= PROT_EXEC;
}
if (True(perms & MemoryPermission::Execute))
prot_flags |= PROT_EXEC;
#endif
void* ret = mmap(virtual_base + virtual_offset, length, flags, MAP_SHARED | MAP_FIXED, fd,
host_offset);
ASSERT_MSG(ret != MAP_FAILED, "mmap failed: {}", strerror(errno));
int flags = (fd > 0 ? MAP_SHARED : MAP_PRIVATE) | MAP_FIXED;
void* ret = mmap(virtual_base + virtual_offset, length, prot_flags, flags, fd, host_offset);
ASSERT_MSG(ret != MAP_FAILED, "mmap: {}", strerror(errno));
}
void Unmap(size_t virtual_offset, size_t length) {
@@ -719,7 +730,9 @@ void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length,
ASSERT(virtual_offset % PageAlignment == 0);
ASSERT(host_offset % PageAlignment == 0);
ASSERT(length % PageAlignment == 0);
ASSERT(virtual_offset + length <= virtual_size);
if (impl && virtual_base) {
ASSERT(virtual_offset + length <= virtual_size);
}
ASSERT(host_offset + length <= backing_size);
if (length == 0 || !virtual_base || !impl) {
return;
@@ -730,7 +743,9 @@ void HostMemory::Map(size_t virtual_offset, size_t host_offset, size_t length,
void HostMemory::Unmap(size_t virtual_offset, size_t length, bool separate_heap) {
ASSERT(virtual_offset % PageAlignment == 0);
ASSERT(length % PageAlignment == 0);
ASSERT(virtual_offset + length <= virtual_size);
if (impl && virtual_base) {
ASSERT(virtual_offset + length <= virtual_size);
}
if (length == 0 || !virtual_base || !impl) {
return;
}
@@ -740,7 +755,9 @@ void HostMemory::Unmap(size_t virtual_offset, size_t length, bool separate_heap)
void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission perm) {
ASSERT(virtual_offset % PageAlignment == 0);
ASSERT(length % PageAlignment == 0);
ASSERT(virtual_offset + length <= virtual_size);
if (impl && virtual_base) {
ASSERT(virtual_offset + length <= virtual_size);
}
if (length == 0 || !virtual_base || !impl) {
return;
}
+15 -1
View File
@@ -1,11 +1,14 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <type_traits>
#include <fmt/ranges.h>
#include "common/swap.h"
// adapted from https://github.com/fmtlib/fmt/issues/2704
// a generic formatter for enum classes
@@ -20,3 +23,14 @@ struct fmt::formatter<T, std::enable_if_t<std::is_enum_v<T>, char>>
}
};
#endif
template <typename T, typename U>
struct fmt::formatter<SwapStructT<T, U>> {
constexpr auto parse(format_parse_context& ctx) {
return ctx.begin();
}
template <typename FormatContext>
auto format(const SwapStructT<T, U>& reg, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", T(reg));
}
};
+4 -1
View File
@@ -169,7 +169,7 @@ bool IsFastmemEnabled() {
if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) {
return bool(values.cpuopt_unsafe_host_mmu);
}
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__)
#if !defined(__APPLE__) && !defined(__linux__) && !defined(__ANDROID__) && !defined(_WIN32)
return false;
#else
return true;
@@ -359,6 +359,9 @@ void RestoreGlobalState(bool is_powered_on) {
for (const auto& reset : values.linkage.restore_functions) {
reset();
}
// Reset per-game flags
values.use_squashed_iterated_blend = false;
}
static bool configuring_global = true;
+59 -2
View File
@@ -240,7 +240,7 @@ struct Values {
Category::Cpu};
SwitchableSetting<CpuAccuracy, true> cpu_accuracy{linkage, CpuAccuracy::Auto,
"cpu_accuracy", Category::Cpu};
SwitchableSetting<bool> vtable_bouncing{linkage, true, "vtable_bouncing", Category::Cpu};
SwitchableSetting<bool> use_fast_cpu_time{linkage,
false,
"use_fast_cpu_time",
@@ -296,7 +296,7 @@ struct Values {
Category::CpuDebug};
SwitchableSetting<bool> cpuopt_unsafe_host_mmu{linkage,
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__)
#if !defined(__APPLE__) && !defined(__linux__) && !defined(__ANDROID__) && !defined(_WIN32)
false,
#else
true,
@@ -560,6 +560,60 @@ struct Values {
false,
&sample_shading};
#ifdef ANDROID
// Shader Float Controls (Android only) - Eden Veil / Extensions
// Force enable VK_KHR_shader_float_controls even if driver has known issues
// Allows fine-tuning float behavior to match Switch/Maxwell or optimize performance
SwitchableSetting<bool> shader_float_controls_force_enable{linkage,
false,
"shader_float_controls_force_enable",
Category::RendererExtensions,
Specialization::Paired};
// Individual float behavior controls (visible only when force_enable is true)
// Multiple can be active simultaneously EXCEPT FTZ and DenormPreserve (mutually exclusive)
//
// Recommended configurations:
// Switch-native: FTZ=ON, RTE=ON, SignedZero=ON (matches Maxwell behavior)
// Performance: FTZ=ON only (fastest)
// Accuracy: DenormPreserve=ON, RTE=ON, SignedZero=ON (slowest, highest precision)
SwitchableSetting<bool> shader_float_ftz{linkage,
false,
"shader_float_ftz",
Category::RendererExtensions,
Specialization::Default,
true,
false,
&shader_float_controls_force_enable};
SwitchableSetting<bool> shader_float_denorm_preserve{linkage,
false,
"shader_float_denorm_preserve",
Category::RendererExtensions,
Specialization::Default,
true,
false,
&shader_float_controls_force_enable};
SwitchableSetting<bool> shader_float_rte{linkage,
false,
"shader_float_rte",
Category::RendererExtensions,
Specialization::Default,
true,
false,
&shader_float_controls_force_enable};
SwitchableSetting<bool> shader_float_signed_zero_inf_nan{linkage,
false,
"shader_float_signed_zero_inf_nan",
Category::RendererExtensions,
Specialization::Default,
true,
false,
&shader_float_controls_force_enable};
#endif
Setting<bool> renderer_debug{linkage, false, "debug", Category::RendererDebug};
Setting<bool> renderer_shader_feedback{linkage, false, "shader_feedback",
Category::RendererDebug};
@@ -759,6 +813,9 @@ struct Values {
// Add-Ons
std::map<u64, std::vector<std::string>> disabled_addons;
// Per-game overrides
bool use_squashed_iterated_blend;
};
extern Values values;
+10
View File
@@ -152,6 +152,16 @@ ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
ENUM(GpuOverclock, Low, Medium, High)
ENUM(TemperatureUnits, Celsius, Fahrenheit)
// Shader Float Controls behavior modes
// These control how floating-point denormals and special values are handled in shaders
ENUM(ShaderFloatBehavior,
DriverDefault, // Let driver choose (safest, may not match Switch behavior)
SwitchNative, // Emulate Switch/Maxwell behavior (FTZ + RTE + SignedZero)
FlushToZero, // FTZ only - flush denorms to zero (fastest, some precision loss)
PreserveDenorms, // Preserve denorms (slowest, highest precision)
RoundToEven, // RTE rounding mode (IEEE 754 compliant)
SignedZeroInfNan); // Preserve signed zero, inf, nan (accuracy for edge cases)
template <typename Type>
inline std::string_view CanonicalizeEnum(Type id) {
const auto group = EnumMetadata<Type>::Canonicalizations();
+140 -139
View File
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2012 PPSSPP Project
// SPDX-FileCopyrightText: 2012 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,7 +20,17 @@
namespace Common {
#ifdef _MSC_VER
#if defined(__Bitrig__) || defined(__OpenBSD__)
// We'll redefine swap16, swap32, swap64 as inline functions
// but OpenBSD is like "wow I bring my own stuff"
// It would be nice if we could use them without C++ namespace shenanigans
// But alas :)
#undef swap16
#undef swap32
#undef swap64
#endif
#if defined(_MSC_VER)
[[nodiscard]] inline u16 swap16(u16 data) noexcept {
return _byteswap_ushort(data);
}
@@ -28,12 +41,6 @@ namespace Common {
return _byteswap_uint64(data);
}
#elif defined(__clang__) || defined(__GNUC__)
#if defined(__Bitrig__) || defined(__OpenBSD__)
// redefine swap16, swap32, swap64 as inline functions
#undef swap16
#undef swap32
#undef swap64
#endif
[[nodiscard]] inline u16 swap16(u16 data) noexcept {
return __builtin_bswap16(data);
}
@@ -44,7 +51,9 @@ namespace Common {
return __builtin_bswap64(data);
}
#else
// Generic implementation.
// Generic implementation - compiler will optimise these into their respective
// __builtin_byteswapXX() and such; if not, the compiler is stupid and we probably
// have bigger problems to worry about :)
[[nodiscard]] inline u16 swap16(u16 data) noexcept {
return (data >> 8) | (data << 8);
}
@@ -62,33 +71,27 @@ namespace Common {
[[nodiscard]] inline float swapf(float f) noexcept {
static_assert(sizeof(u32) == sizeof(float), "float must be the same size as uint32_t.");
u32 value;
std::memcpy(&value, &f, sizeof(u32));
value = swap32(value);
std::memcpy(&f, &value, sizeof(u32));
return f;
}
[[nodiscard]] inline double swapd(double f) noexcept {
static_assert(sizeof(u64) == sizeof(double), "double must be the same size as uint64_t.");
u64 value;
std::memcpy(&value, &f, sizeof(u64));
value = swap64(value);
std::memcpy(&f, &value, sizeof(u64));
return f;
}
} // Namespace Common
template <typename T, typename F>
struct swap_struct_t {
using swapped_t = swap_struct_t;
struct SwapStructT {
using SwappedT = SwapStructT;
protected:
T value;
@@ -101,137 +104,137 @@ public:
T swap() const {
return swap(value);
}
swap_struct_t() = default;
swap_struct_t(const T& v) : value(swap(v)) {}
SwapStructT() = default;
SwapStructT(const T& v) : value(swap(v)) {}
template <typename S>
swapped_t& operator=(const S& source) {
value = swap(static_cast<T>(source));
SwappedT& operator=(const S& source) {
value = swap(T(source));
return *this;
}
operator s8() const {
return static_cast<s8>(swap());
return s8(swap());
}
operator u8() const {
return static_cast<u8>(swap());
return u8(swap());
}
operator s16() const {
return static_cast<s16>(swap());
return s16(swap());
}
operator u16() const {
return static_cast<u16>(swap());
return u16(swap());
}
operator s32() const {
return static_cast<s32>(swap());
return s32(swap());
}
operator u32() const {
return static_cast<u32>(swap());
return u32(swap());
}
operator s64() const {
return static_cast<s64>(swap());
return s64(swap());
}
operator u64() const {
return static_cast<u64>(swap());
return u64(swap());
}
operator float() const {
return static_cast<float>(swap());
return float(swap());
}
operator double() const {
return static_cast<double>(swap());
return double(swap());
}
// +v
swapped_t operator+() const {
SwappedT operator+() const {
return +swap();
}
// -v
swapped_t operator-() const {
SwappedT operator-() const {
return -swap();
}
// v / 5
swapped_t operator/(const swapped_t& i) const {
SwappedT operator/(const SwappedT& i) const {
return swap() / i.swap();
}
template <typename S>
swapped_t operator/(const S& i) const {
SwappedT operator/(const S& i) const {
return swap() / i;
}
// v * 5
swapped_t operator*(const swapped_t& i) const {
SwappedT operator*(const SwappedT& i) const {
return swap() * i.swap();
}
template <typename S>
swapped_t operator*(const S& i) const {
SwappedT operator*(const S& i) const {
return swap() * i;
}
// v + 5
swapped_t operator+(const swapped_t& i) const {
SwappedT operator+(const SwappedT& i) const {
return swap() + i.swap();
}
template <typename S>
swapped_t operator+(const S& i) const {
return swap() + static_cast<T>(i);
SwappedT operator+(const S& i) const {
return swap() + T(i);
}
// v - 5
swapped_t operator-(const swapped_t& i) const {
SwappedT operator-(const SwappedT& i) const {
return swap() - i.swap();
}
template <typename S>
swapped_t operator-(const S& i) const {
return swap() - static_cast<T>(i);
SwappedT operator-(const S& i) const {
return swap() - T(i);
}
// v += 5
swapped_t& operator+=(const swapped_t& i) {
SwappedT& operator+=(const SwappedT& i) {
value = swap(swap() + i.swap());
return *this;
}
template <typename S>
swapped_t& operator+=(const S& i) {
value = swap(swap() + static_cast<T>(i));
SwappedT& operator+=(const S& i) {
value = swap(swap() + T(i));
return *this;
}
// v -= 5
swapped_t& operator-=(const swapped_t& i) {
SwappedT& operator-=(const SwappedT& i) {
value = swap(swap() - i.swap());
return *this;
}
template <typename S>
swapped_t& operator-=(const S& i) {
value = swap(swap() - static_cast<T>(i));
SwappedT& operator-=(const S& i) {
value = swap(swap() - T(i));
return *this;
}
// ++v
swapped_t& operator++() {
SwappedT& operator++() {
value = swap(swap() + 1);
return *this;
}
// --v
swapped_t& operator--() {
SwappedT& operator--() {
value = swap(swap() - 1);
return *this;
}
// v++
swapped_t operator++(int) {
swapped_t old = *this;
SwappedT operator++(int) {
SwappedT old = *this;
value = swap(swap() + 1);
return old;
}
// v--
swapped_t operator--(int) {
swapped_t old = *this;
SwappedT operator--(int) {
SwappedT old = *this;
value = swap(swap() - 1);
return old;
}
// Comparison
// v == i
bool operator==(const swapped_t& i) const {
bool operator==(const SwappedT& i) const {
return swap() == i.swap();
}
template <typename S>
@@ -240,7 +243,7 @@ public:
}
// v != i
bool operator!=(const swapped_t& i) const {
bool operator!=(const SwappedT& i) const {
return swap() != i.swap();
}
template <typename S>
@@ -249,7 +252,7 @@ public:
}
// v > i
bool operator>(const swapped_t& i) const {
bool operator>(const SwappedT& i) const {
return swap() > i.swap();
}
template <typename S>
@@ -258,7 +261,7 @@ public:
}
// v < i
bool operator<(const swapped_t& i) const {
bool operator<(const SwappedT& i) const {
return swap() < i.swap();
}
template <typename S>
@@ -267,7 +270,7 @@ public:
}
// v >= i
bool operator>=(const swapped_t& i) const {
bool operator>=(const SwappedT& i) const {
return swap() >= i.swap();
}
template <typename S>
@@ -276,7 +279,7 @@ public:
}
// v <= i
bool operator<=(const swapped_t& i) const {
bool operator<=(const SwappedT& i) const {
return swap() <= i.swap();
}
template <typename S>
@@ -285,82 +288,82 @@ public:
}
// logical
swapped_t operator!() const {
SwappedT operator!() const {
return !swap();
}
// bitmath
swapped_t operator~() const {
SwappedT operator~() const {
return ~swap();
}
swapped_t operator&(const swapped_t& b) const {
SwappedT operator&(const SwappedT& b) const {
return swap() & b.swap();
}
template <typename S>
swapped_t operator&(const S& b) const {
SwappedT operator&(const S& b) const {
return swap() & b;
}
swapped_t& operator&=(const swapped_t& b) {
SwappedT& operator&=(const SwappedT& b) {
value = swap(swap() & b.swap());
return *this;
}
template <typename S>
swapped_t& operator&=(const S b) {
SwappedT& operator&=(const S b) {
value = swap(swap() & b);
return *this;
}
swapped_t operator|(const swapped_t& b) const {
SwappedT operator|(const SwappedT& b) const {
return swap() | b.swap();
}
template <typename S>
swapped_t operator|(const S& b) const {
SwappedT operator|(const S& b) const {
return swap() | b;
}
swapped_t& operator|=(const swapped_t& b) {
SwappedT& operator|=(const SwappedT& b) {
value = swap(swap() | b.swap());
return *this;
}
template <typename S>
swapped_t& operator|=(const S& b) {
SwappedT& operator|=(const S& b) {
value = swap(swap() | b);
return *this;
}
swapped_t operator^(const swapped_t& b) const {
SwappedT operator^(const SwappedT& b) const {
return swap() ^ b.swap();
}
template <typename S>
swapped_t operator^(const S& b) const {
SwappedT operator^(const S& b) const {
return swap() ^ b;
}
swapped_t& operator^=(const swapped_t& b) {
SwappedT& operator^=(const SwappedT& b) {
value = swap(swap() ^ b.swap());
return *this;
}
template <typename S>
swapped_t& operator^=(const S& b) {
SwappedT& operator^=(const S& b) {
value = swap(swap() ^ b);
return *this;
}
template <typename S>
swapped_t operator<<(const S& b) const {
SwappedT operator<<(const S& b) const {
return swap() << b;
}
template <typename S>
swapped_t& operator<<=(const S& b) const {
SwappedT& operator<<=(const S& b) const {
value = swap(swap() << b);
return *this;
}
template <typename S>
swapped_t operator>>(const S& b) const {
SwappedT operator>>(const S& b) const {
return swap() >> b;
}
template <typename S>
swapped_t& operator>>=(const S& b) const {
SwappedT& operator>>=(const S& b) const {
value = swap(swap() >> b);
return *this;
}
@@ -370,167 +373,167 @@ public:
// Arithmetic
template <typename S, typename T2, typename F2>
friend S operator+(const S& p, const swapped_t v);
friend S operator+(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend S operator-(const S& p, const swapped_t v);
friend S operator-(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend S operator/(const S& p, const swapped_t v);
friend S operator/(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend S operator*(const S& p, const swapped_t v);
friend S operator*(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend S operator%(const S& p, const swapped_t v);
friend S operator%(const S& p, const SwappedT v);
// Arithmetic + assignments
template <typename S, typename T2, typename F2>
friend S operator+=(const S& p, const swapped_t v);
friend S operator+=(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend S operator-=(const S& p, const swapped_t v);
friend S operator-=(const S& p, const SwappedT v);
// Bitmath
template <typename S, typename T2, typename F2>
friend S operator&(const S& p, const swapped_t v);
friend S operator&(const S& p, const SwappedT v);
// Comparison
template <typename S, typename T2, typename F2>
friend bool operator<(const S& p, const swapped_t v);
friend bool operator<(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend bool operator>(const S& p, const swapped_t v);
friend bool operator>(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend bool operator<=(const S& p, const swapped_t v);
friend bool operator<=(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend bool operator>=(const S& p, const swapped_t v);
friend bool operator>=(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend bool operator!=(const S& p, const swapped_t v);
friend bool operator!=(const S& p, const SwappedT v);
template <typename S, typename T2, typename F2>
friend bool operator==(const S& p, const swapped_t v);
friend bool operator==(const S& p, const SwappedT v);
};
// Arithmetic
template <typename S, typename T, typename F>
S operator+(const S& i, const swap_struct_t<T, F> v) {
S operator+(const S& i, const SwapStructT<T, F> v) {
return i + v.swap();
}
template <typename S, typename T, typename F>
S operator-(const S& i, const swap_struct_t<T, F> v) {
S operator-(const S& i, const SwapStructT<T, F> v) {
return i - v.swap();
}
template <typename S, typename T, typename F>
S operator/(const S& i, const swap_struct_t<T, F> v) {
S operator/(const S& i, const SwapStructT<T, F> v) {
return i / v.swap();
}
template <typename S, typename T, typename F>
S operator*(const S& i, const swap_struct_t<T, F> v) {
S operator*(const S& i, const SwapStructT<T, F> v) {
return i * v.swap();
}
template <typename S, typename T, typename F>
S operator%(const S& i, const swap_struct_t<T, F> v) {
S operator%(const S& i, const SwapStructT<T, F> v) {
return i % v.swap();
}
// Arithmetic + assignments
template <typename S, typename T, typename F>
S& operator+=(S& i, const swap_struct_t<T, F> v) {
S& operator+=(S& i, const SwapStructT<T, F> v) {
i += v.swap();
return i;
}
template <typename S, typename T, typename F>
S& operator-=(S& i, const swap_struct_t<T, F> v) {
S& operator-=(S& i, const SwapStructT<T, F> v) {
i -= v.swap();
return i;
}
// Logical
template <typename S, typename T, typename F>
S operator&(const S& i, const swap_struct_t<T, F> v) {
S operator&(const S& i, const SwapStructT<T, F> v) {
return i & v.swap();
}
// Comparison
template <typename S, typename T, typename F>
bool operator<(const S& p, const swap_struct_t<T, F> v) {
bool operator<(const S& p, const SwapStructT<T, F> v) {
return p < v.swap();
}
template <typename S, typename T, typename F>
bool operator>(const S& p, const swap_struct_t<T, F> v) {
bool operator>(const S& p, const SwapStructT<T, F> v) {
return p > v.swap();
}
template <typename S, typename T, typename F>
bool operator<=(const S& p, const swap_struct_t<T, F> v) {
bool operator<=(const S& p, const SwapStructT<T, F> v) {
return p <= v.swap();
}
template <typename S, typename T, typename F>
bool operator>=(const S& p, const swap_struct_t<T, F> v) {
bool operator>=(const S& p, const SwapStructT<T, F> v) {
return p >= v.swap();
}
template <typename S, typename T, typename F>
bool operator!=(const S& p, const swap_struct_t<T, F> v) {
bool operator!=(const S& p, const SwapStructT<T, F> v) {
return p != v.swap();
}
template <typename S, typename T, typename F>
bool operator==(const S& p, const swap_struct_t<T, F> v) {
bool operator==(const S& p, const SwapStructT<T, F> v) {
return p == v.swap();
}
template <typename T>
struct swap_64_t {
struct Swap64T {
static T swap(T x) {
return static_cast<T>(Common::swap64(x));
return T(Common::swap64(x));
}
};
template <typename T>
struct swap_32_t {
struct Swap32T {
static T swap(T x) {
return static_cast<T>(Common::swap32(x));
return T(Common::swap32(x));
}
};
template <typename T>
struct swap_16_t {
struct Swap16T {
static T swap(T x) {
return static_cast<T>(Common::swap16(x));
return T(Common::swap16(x));
}
};
template <typename T>
struct swap_float_t {
struct SwapFloatT {
static T swap(T x) {
return static_cast<T>(Common::swapf(x));
return T(Common::swapf(x));
}
};
template <typename T>
struct swap_double_t {
struct SwapDoubleT {
static T swap(T x) {
return static_cast<T>(Common::swapd(x));
return T(Common::swapd(x));
}
};
template <typename T>
struct swap_enum_t {
struct SwapEnumT {
static_assert(std::is_enum_v<T>);
using base = std::underlying_type_t<T>;
public:
swap_enum_t() = default;
swap_enum_t(const T& v) : value(swap(v)) {}
SwapEnumT() = default;
SwapEnumT(const T& v) : value(swap(v)) {}
swap_enum_t& operator=(const T& v) {
SwapEnumT& operator=(const T& v) {
value = swap(v);
return *this;
}
@@ -540,22 +543,20 @@ public:
}
explicit operator base() const {
return static_cast<base>(swap(value));
return base(swap(value));
}
protected:
T value{};
// clang-format off
using swap_t = std::conditional_t<
std::is_same_v<base, u16>, swap_16_t<u16>, std::conditional_t<
std::is_same_v<base, s16>, swap_16_t<s16>, std::conditional_t<
std::is_same_v<base, u32>, swap_32_t<u32>, std::conditional_t<
std::is_same_v<base, s32>, swap_32_t<s32>, std::conditional_t<
std::is_same_v<base, u64>, swap_64_t<u64>, std::conditional_t<
std::is_same_v<base, s64>, swap_64_t<s64>, void>>>>>>;
// clang-format on
std::is_same_v<base, u16>, Swap16T<u16>, std::conditional_t<
std::is_same_v<base, s16>, Swap16T<s16>, std::conditional_t<
std::is_same_v<base, u32>, Swap32T<u32>, std::conditional_t<
std::is_same_v<base, s32>, Swap32T<s32>, std::conditional_t<
std::is_same_v<base, u64>, Swap64T<u64>, std::conditional_t<
std::is_same_v<base, s64>, Swap64T<s64>, void>>>>>>;
static T swap(T x) {
return static_cast<T>(swap_t::swap(static_cast<base>(x)));
return T(swap_t::swap(base(x)));
}
};
@@ -581,17 +582,17 @@ struct AddEndian<u8, SwapTag> {
template <>
struct AddEndian<u16, SwapTag> {
using type = swap_struct_t<u16, swap_16_t<u16>>;
using type = SwapStructT<u16, Swap16T<u16>>;
};
template <>
struct AddEndian<u32, SwapTag> {
using type = swap_struct_t<u32, swap_32_t<u32>>;
using type = SwapStructT<u32, Swap32T<u32>>;
};
template <>
struct AddEndian<u64, SwapTag> {
using type = swap_struct_t<u64, swap_64_t<u64>>;
using type = SwapStructT<u64, Swap64T<u64>>;
};
template <>
@@ -601,33 +602,33 @@ struct AddEndian<s8, SwapTag> {
template <>
struct AddEndian<s16, SwapTag> {
using type = swap_struct_t<s16, swap_16_t<s16>>;
using type = SwapStructT<s16, Swap16T<s16>>;
};
template <>
struct AddEndian<s32, SwapTag> {
using type = swap_struct_t<s32, swap_32_t<s32>>;
using type = SwapStructT<s32, Swap32T<s32>>;
};
template <>
struct AddEndian<s64, SwapTag> {
using type = swap_struct_t<s64, swap_64_t<s64>>;
using type = SwapStructT<s64, Swap64T<s64>>;
};
template <>
struct AddEndian<float, SwapTag> {
using type = swap_struct_t<float, swap_float_t<float>>;
using type = SwapStructT<float, SwapFloatT<float>>;
};
template <>
struct AddEndian<double, SwapTag> {
using type = swap_struct_t<double, swap_double_t<double>>;
using type = SwapStructT<double, SwapDoubleT<double>>;
};
template <typename T>
struct AddEndian<T, SwapTag> {
static_assert(std::is_enum_v<T>);
using type = swap_enum_t<T>;
using type = SwapEnumT<T>;
};
// Alias LETag/BETag as KeepTag/SwapTag depending on the system

Some files were not shown because too many files have changed in this diff Show More