Compare commits

..

217 Commits

Author SHA1 Message Date
CamilleLaVey
96422c0896 Fix building issues 2025-11-21 19:25:15 -04:00
CamilleLaVey
8e8b5e9e63 [vk] Configuring VK_EXT_Custom_Border_Color of Hell. 2025-11-21 19:15:35 -04:00
CamilleLaVey
6c58ff734a [vk. amd] Removing old blacklist from feature usage for AMD 2025-11-21 18:31:25 -04:00
CamilleLaVey
d3b9a48e8c Revert "[vk, texture_cache} Organizing VK formats with Specs validation"
This reverts commit 24341611e4.
2025-11-21 18:01:21 -04:00
CamilleLaVey
8cfc2ce3c0 {vk, texture_cache] TEST: Adjusting vk format reinterpretation 2025-11-21 17:16:15 -04:00
CamilleLaVey
b76b1c6cf1 [Vk, pipeline_cache] Removing turnip for clamping memory 2025-11-21 15:44:37 -04:00
CamilleLaVey
24341611e4 [vk, texture_cache} Organizing VK formats with Specs validation 2025-11-21 15:40:29 -04:00
CamilleLaVey
3798228275 [vk, pipeline_Cache] Manage of shared memory access and usage 2025-11-21 14:34:00 -04:00
CamilleLaVey
6ff16e0282 Merge branch 'stuffmadeforfun' of https://git.eden-emu.dev/eden-emu/eden into stuffmadeforfun 2025-11-21 12:11:38 -04:00
CamilleLaVey
3b95438059 [vk. texture_cache] WIP: Identity Swizzle must be compiliant to VK SPECS. 2025-11-21 12:11:30 -04:00
PavelBARABANOV
2522b15034 [android] toggles force identity swizzle and force ldr to srgb 2025-11-20 21:16:49 +03:00
CamilleLaVey
d53225835a [vk] Toggle for LDR degradation with sRGB 2025-11-20 01:41:22 -04:00
CamilleLaVey
fccecc0664 [vk] adding identity swizzle optional use 2025-11-20 01:20:33 -04:00
CamilleLaVey
334a440af8 [vk, texture_cache] Refining vk format reinterpreation usage 2025-11-20 00:25:27 -04:00
CamilleLaVey
8c22603f68 rebase errors fix 2025-11-20 00:04:02 -04:00
CamilleLaVey
2208ffaec5 Rebased from master 2025-11-19 22:06:50 -04:00
CamilleLaVey
a35e761f82 Revert "[vk, qcom] Remove VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE for QCOM drivers" 2025-11-20 00:37:56 +00:00
CamilleLaVey
37c38cb0c7 [vk, qcom] Remove VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE for QCOM drivers 2025-11-20 00:37:56 +00:00
PavelBARABANOV
23204cfd1e Revert "[shader_recompiler, spir-v] Adding INT64 emulation path"
This reverts commit 033531509b.
2025-11-20 00:37:56 +00:00
xbzk
c2301fd228 VIDS toggle added (#3052)
Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3052
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-20 00:37:56 +00:00
xbzk
470291f787 VIDS toggle added (#3051)
Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3051
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-20 00:37:56 +00:00
Kleidis
fa94828ea7 fix format_reinterpretation on pc and add it to android (#3049)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3049
Co-authored-by: Kleidis <kleidis1@protonmail.com>
Co-committed-by: Kleidis <kleidis1@protonmail.com>
2025-11-20 00:37:56 +00:00
lizzie
05e8f2fd83 fixes bitfields 2 2025-11-20 00:37:54 +00:00
lizzie
9e9d9716bf fix bitfields 2025-11-20 00:37:47 +00:00
lizzie
04cb0e4157 fixup 2025-11-20 00:37:47 +00:00
CamilleLaVey
6d3c8a4577 [vk, texture_cache] Handling for integer formats with float samplers 2025-11-20 00:37:47 +00:00
CamilleLaVey
9c2c83d429 [vk] Corrections to VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE 2025-11-20 00:37:47 +00:00
CamilleLaVey
4e8ce769b6 [vk] Reordering disabled broken DynamicState and ExtendedDynamicState 2025-11-20 00:37:47 +00:00
CamilleLaVey
6922216c0f [vk, qcom] Disabled SFC and added more qcom features 2025-11-20 00:37:47 +00:00
CamilleLaVey
b85bf7d0ae [vk, qcom] Default FP32 2025-11-20 00:37:47 +00:00
CamilleLaVey
5d9f379bd9 [vk] compiler baka baka 2025-11-20 00:37:47 +00:00
CamilleLaVey
f3290428e2 [vk] Handling padding (compiler tomto) 2025-11-20 00:37:47 +00:00
CamilleLaVey
1e0b300e85 Adding missing headers 2025-11-20 00:37:47 +00:00
CamilleLaVey
cb8fb25126 [vk] Simplifying DynamicState and ExtendedState with Bitfield 2025-11-20 00:37:45 +00:00
CamilleLaVey
37d0d43c94 [vk] Refactor to DynamicState and ExtendedState 2025-11-20 00:37:35 +00:00
CamilleLaVey
5c205edcbd [vk, texture_cache] Remove Force Identity in Component Swizzle 2025-11-20 00:37:24 +00:00
CamilleLaVey
dbb33e903d [vk, android] Scaled Formats Emulation Only Available on Android 2025-11-20 00:37:24 +00:00
CamilleLaVey
37d407ab32 [vk, pipeline_cache] TEST: Refactor shader float controls handling for Qualcomm devices 2025-11-20 00:37:24 +00:00
CamilleLaVey
dc0ddce0fe [vk, texture_cache, pipeline_cache] Removing handling for wrong vk formats 2025-11-20 00:37:23 +00:00
PavelBARABANOV
a2a9045718 comment 2025-11-20 00:37:23 +00:00
PavelBARABANOV
6f4672d8c8 [vk] Add Android-specific sRGB fallback format 2025-11-20 00:37:23 +00:00
CamilleLaVey
481c1b0486 Fixing building issues again, dammed binding. 2025-11-20 00:37:23 +00:00
CamilleLaVey
c39934aa65 [spir-v] Include more cases for ColorArray1D 2025-11-20 00:37:23 +00:00
CamilleLaVey
e12c7f44cc [vk, spir-v] Refining the path for Array 1D emulation and R32 Uint handling consistency 2025-11-20 00:37:23 +00:00
CamilleLaVey
c2412e53c0 Fix building/ licensing issues 2025-11-20 00:37:23 +00:00
CamilleLaVey
56de1618b6 [vk, texture_cache, pipeline_cache] Refining handling of R32 2025-11-20 00:37:23 +00:00
CamilleLaVey
e0de78aaa3 [vk, texture_cache] Workaround for games with wrong usage of R32 with float samplers 2025-11-20 00:37:23 +00:00
CamilleLaVey
4e36d2e468 [vk, pipeline_cache, texture_cache, qcom] Resolving textures and pipeline usage for QCOM 2025-11-20 00:37:23 +00:00
CamilleLaVey
4495724c2a [vk, spir-v] Adding emulation of Array 1D with 2D for Android 2025-11-20 00:37:23 +00:00
CamilleLaVey
f9e484fba6 [vk] Handling threading missuse of VkQueue 2025-11-20 00:37:23 +00:00
CamilleLaVey
07f07d8d39 [vk, Maxwell] Refining support for HDR Formats based on Specs 2025-11-20 00:37:23 +00:00
CamilleLaVey
54f92930e2 [vk] Degrade HDR Format to LDR 2025-11-20 00:37:23 +00:00
CamilleLaVey
01658fc320 [vk, qcom] TEST: Adjustment to the MSAA and format resolve with native support 2025-11-20 00:37:23 +00:00
CamilleLaVey
5845764ed4 [vk] Re-adjusted HDR format handling based on physical specifications 2025-11-20 00:37:23 +00:00
CamilleLaVey
cf06bd9a4b [vk, qcom] Revert Push Descriptors Threshold due to data corruption 2025-11-20 00:37:23 +00:00
CamilleLaVey
19ea6bb629 [vk, qcom] Including Tile Properties and Store Ops based on QCOM specifications 2025-11-20 00:37:23 +00:00
CamilleLaVey
be245477af [vk, host shaders, qcom] MSAA Handling by Native QCOM Shader Resolve 2025-11-20 00:37:23 +00:00
lizzie
47e6072a29 fix license 2025-11-20 00:37:23 +00:00
CamilleLaVey
4e8ec2551a [memory, vk] TEST: Tiled GPU optimization try #1 2025-11-20 00:37:23 +00:00
CamilleLaVey
f418c6c3b0 Fix building issues 2025-11-20 00:37:23 +00:00
CamilleLaVey
6bce124b28 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-20 00:37:23 +00:00
CamilleLaVey
65284939e6 [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-20 00:37:23 +00:00
PavelBARABANOV
98baa7c918 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-20 00:37:23 +00:00
CamilleLaVey
32c12852a8 Adding missing headers 2025-11-20 00:37:23 +00:00
CamilleLaVey
f562b9032d [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-20 00:37:23 +00:00
CamilleLaVey
f00031d421 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-20 00:37:23 +00:00
lizzie
86cd8a98c5 fix 2025-11-20 00:37:23 +00:00
CamilleLaVey
d5e7b51c97 Implement handling for texture cache flickering 2025-11-20 00:37:23 +00:00
crueter
3c114eeaaa build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-20 00:37:23 +00:00
CamilleLaVey
dfb09191f3 attempt to fix building issues 2025-11-20 00:37:23 +00:00
CamilleLaVey
63a9eb9d62 Giving maintance to driver features and unused extensions 2025-11-20 00:37:23 +00:00
CamilleLaVey
3fe1ec9322 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-20 00:37:21 +00:00
PavelBARABANOV
60d4f84ad3 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-20 00:37:14 +00:00
CamilleLaVey
baf821f5a2 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-20 00:36:46 +00:00
crueter
e3507c741e build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-20 00:36:27 +00:00
CamilleLaVey
b1e984475f attempt to fix building issues 2025-11-20 00:36:27 +00:00
CamilleLaVey
24238c215a Giving maintance to driver features and unused extensions 2025-11-20 00:36:27 +00:00
CamilleLaVey
0c1030e2cb [service, hle] Add defensive check in WriteBuffer 2025-11-20 00:36:06 +00:00
CamilleLaVey
ad45b41c48 [memory, vk] TEST: Tiled GPU optimization try #1 2025-11-20 00:36:06 +00:00
CamilleLaVey
eb4d094a56 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-20 00:36:06 +00:00
PavelBARABANOV
b4cbc89596 Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-20 00:35:56 +00:00
CamilleLaVey
7f587e952c Adding missing headers 2025-11-20 00:35:56 +00:00
CamilleLaVey
522e17c865 [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-20 00:35:26 +00:00
CamilleLaVey
de914eeaa0 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-20 00:34:44 +00:00
CamilleLaVey
9dd79109d5 Implement handling for texture cache flickering 2025-11-20 00:34:44 +00:00
crueter
0ce3fab047 build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-20 00:34:32 +00:00
CamilleLaVey
3dd1c12b9f attempt to fix building issues 2025-11-20 00:34:32 +00:00
CamilleLaVey
d097764008 Giving maintance to driver features and unused extensions 2025-11-20 00:34:32 +00:00
CamilleLaVey
21bfce5ab9 Fix building issues 2025-11-20 00:33:20 +00:00
CamilleLaVey
73f8b5ff42 [texture_cache, gl, vk] Initial implementation for HDR + MSAA detection on QCOM drivers. 2025-11-20 00:33:20 +00:00
CamilleLaVey
d3f827868d [shader_recompiler, spir-v] verifying int64 emulation path activation 2025-11-20 00:33:20 +00:00
PavelBARABANOV
ac581764ca Revert "TEST: Enabling TimelineSemaphores for QCOM and Turnip"
This reverts commit 3cd33fce44.
2025-11-20 00:33:20 +00:00
CamilleLaVey
2994723321 Adding missing headers 2025-11-20 00:33:20 +00:00
CamilleLaVey
4726894c58 [gl, vk, texture cache] Attempt to get correct MSAA image upload and download 2025-11-20 00:33:20 +00:00
CamilleLaVey
a147c45dfa [shader_recompiler, spir-v] Adding INT64 emulation path 2025-11-20 00:33:20 +00:00
CamilleLaVey
3fab473f68 Fixing missing headers 2025-11-20 00:33:20 +00:00
CamilleLaVey
3ad77cf268 [gl. vk] Extending impl for atomic floats operations 2025-11-20 00:33:20 +00:00
CamilleLaVey
b9b2c84e03 Changing checks in HostMemor for virtual memory mapping 2025-11-20 00:33:19 +00:00
CamilleLaVey
a3a59aca91 TEST: Enabling TimelineSemaphores for QCOM and Turnip 2025-11-20 00:33:19 +00:00
CamilleLaVey
5da42f728c Improved handling for Custom Border Color buggy impl on ARM/ QCOM and Turnip 2025-11-20 00:33:19 +00:00
lizzie
c1c15277b1 fix 2025-11-20 00:33:19 +00:00
CamilleLaVey
08cfef6883 Implement handling for texture cache flickering 2025-11-20 00:33:19 +00:00
crueter
c2a1488529 build
Signed-off-by: crueter <crueter@eden-emu.dev>
2025-11-20 00:33:19 +00:00
CamilleLaVey
aaf5fbc289 attempt to fix building issues 2025-11-20 00:33:19 +00:00
CamilleLaVey
ecef42f2c5 Giving maintance to driver features and unused extensions 2025-11-20 00:33:19 +00:00
CamilleLaVey
d6debaa49c Revert "[vk, qcom] Remove VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE for QCOM drivers" 2025-11-19 20:16:36 -04:00
CamilleLaVey
43a4ad946d [vk, qcom] Remove VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE for QCOM drivers 2025-11-19 18:26:21 -04:00
PavelBARABANOV
045415b9bb Revert "[shader_recompiler, spir-v] Adding INT64 emulation path"
This reverts commit 033531509b.
2025-11-20 00:57:22 +03:00
xbzk
34351e8c1a VIDS toggle added (#3052)
Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3052
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-19 21:40:17 +01:00
xbzk
1f43d1f66c VIDS toggle added (#3051)
Co-authored-by: Allison Cunha <allisonbzk@gmail.com>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3051
Co-authored-by: xbzk <xbzk@eden-emu.dev>
Co-committed-by: xbzk <xbzk@eden-emu.dev>
2025-11-19 21:21:53 +01:00
Kleidis
9628044990 fix format_reinterpretation on pc and add it to android (#3049)
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3049
Co-authored-by: Kleidis <kleidis1@protonmail.com>
Co-committed-by: Kleidis <kleidis1@protonmail.com>
2025-11-19 19:34:39 +01:00
CamilleLaVey
1ed5af15b1 Merge branch 'stuffmadeforfun' of https://git.eden-emu.dev/eden-emu/eden into stuffmadeforfun 2025-11-19 01:55:07 -04:00
CamilleLaVey
69bd1d5c8a [vk, texture_cache] Handling for integer formats with float samplers 2025-11-19 01:54:55 -04:00
lizzie
c9739c7d57 fixes bitfields 2 2025-11-18 22:15:09 +00:00
lizzie
76975ed544 fix bitfields 2025-11-18 22:09:40 +00:00
lizzie
eb7d25718c fixup 2025-11-18 21:27:13 +00:00
CamilleLaVey
370b4c4109 [vk] Corrections to VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE 2025-11-18 16:32:14 -04:00
CamilleLaVey
4a8085a6cf [vk] Reordering disabled broken DynamicState and ExtendedDynamicState 2025-11-18 03:52:14 -04:00
CamilleLaVey
aa85880902 [vk, qcom] Disabled SFC and added more qcom features 2025-11-18 03:01:58 -04:00
CamilleLaVey
69cc6c4b59 [vk, qcom] Default FP32 2025-11-18 00:59:24 -04:00
CamilleLaVey
2d08578b1d [vk] compiler baka baka 2025-11-17 22:33:10 -04:00
CamilleLaVey
d86cfbe5d0 [vk] Handling padding (compiler tomto) 2025-11-17 22:26:24 -04:00
CamilleLaVey
b90cd12c7d Adding missing headers 2025-11-17 22:16:29 -04:00
CamilleLaVey
53a827ac4f [vk] Simplifying DynamicState and ExtendedState with Bitfield 2025-11-17 22:14:34 -04:00
CamilleLaVey
bba1904529 [vk] Refactor to DynamicState and ExtendedState 2025-11-17 21:53:34 -04:00
CamilleLaVey
e33d2541d2 [vk, texture_cache] Remove Force Identity in Component Swizzle 2025-11-17 20:55:47 -04:00
CamilleLaVey
3628654a98 [vk, android] Scaled Formats Emulation Only Available on Android 2025-11-17 20:47:49 -04:00
CamilleLaVey
1f5def5756 [vk, pipeline_cache] TEST: Refactor shader float controls handling for Qualcomm devices 2025-11-17 20:30:17 -04:00
CamilleLaVey
ca479883ec [vk, texture_cache, pipeline_cache] Removing handling for wrong vk formats 2025-11-17 02:13:39 -04:00
PavelBARABANOV
300c913883 comment 2025-11-16 20:11:56 +03:00
PavelBARABANOV
15b9a373cc [vk] Add Android-specific sRGB fallback format 2025-11-16 20:07:30 +03:00
CamilleLaVey
d19229b179 Fixing building issues again, dammed binding. 2025-11-16 02:20:00 -04:00
CamilleLaVey
0d999519a4 [spir-v] Include more cases for ColorArray1D 2025-11-16 02:03:46 -04:00
CamilleLaVey
92e9b82f6e [vk, spir-v] Refining the path for Array 1D emulation and R32 Uint handling consistency 2025-11-16 01:48:18 -04:00
CamilleLaVey
21575a7cc2 Fix building/ licensing issues 2025-11-15 23:18:39 -04:00
CamilleLaVey
7d8c5dad97 [vk, texture_cache, pipeline_cache] Refining handling of R32 2025-11-15 23:06:47 -04: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
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
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
226 changed files with 3113 additions and 3373 deletions

View File

@@ -1,4 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Eden Discord
url: https://discord.gg/HstXbPch7X
- name: yuzu Discord
url: https://discord.com/invite/u77vRWY
about: If you are experiencing an issue with yuzu, and you need tech support, or if you have a general question, try asking in the official yuzu Discord linked here. Piracy is not allowed.
- name: Community forums
url: https://community.citra-emu.org
about: This is an alternative place for tech support, however helpers there are not as active.

View File

@@ -14,7 +14,6 @@ License: GPL-2.0-or-later
Files: dist/qt_themes/default/icons/256x256/eden.png
dist/qt_themes/default/icons/256x256/eden_named.png
dist/Assets.car
dist/yuzu.bmp
dist/eden.icns
dist/eden.ico

View File

@@ -128,6 +128,9 @@ if (YUZU_STATIC_BUILD)
## 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")
@@ -158,22 +161,20 @@ if (YUZU_STATIC_BUILD)
set(YUZU_USE_BUNDLED_OPENSSL ON)
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
## some libraries define a Library::Name_static alternative ##
set(MBEDTLS_LIB_SUFFIX _static)
elseif(APPLE)
# these libs do not properly provide static libs/let you do it with cmake
set(YUZU_USE_CPM ON)
set(YUZU_USE_BUNDLED_FFMPEG ON)
set(YUZU_USE_BUNDLED_SDL2 ON)
set(YUZU_USE_BUNDLED_OPENSSL ON)
# these libs do not properly provide static libs/let you do it with cmake
# IMPORTED_IMPLIB not set for imported target
# TODO(crueter): wtf
set(fmt_FORCE_BUNDLED ON)
set(SPIRV-Tools_FORCE_BUNDLED ON)
set(SPIRV-Headers_FORCE_BUNDLED ON)
set(zstd_FORCE_BUNDLED ON)
set(MbedTLS_FORCE_BUNDLED ON)
endif()
endif()

View File

@@ -1,5 +1,6 @@
# Contributing
<!--
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
SPDX-License-Identifier: GPL-2.0-or-later
-->
You want to contribute? Please consult [the development guide](./docs/Development.md).
Don't forget to [get a git account](./docs/SIGNUP.md) - not a requirement per se but it's highly recommended.
**The Contributor's Guide has moved to [the yuzu wiki](https://github.com/yuzu-emu/yuzu/wiki/Contributing).**

View File

@@ -21,7 +21,7 @@ It is written in C++ with portability in mind, and we actively maintain builds f
<p align="center">
</a>
<a href="https://discord.gg/HstXbPch7X">
<a href="https://discord.gg/kXAmGCXBGD">
<img src="https://img.shields.io/discord/1367654015269339267?color=5865F2&label=Eden&logo=discord&logoColor=white"
alt="Discord">
</a>
@@ -52,8 +52,8 @@ Check out our [website](https://eden-emu.dev) for the latest news on exciting fe
## Development
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/HstXbPch7X) or [Revolt](https://rvlt.gg/qKgFEAbH).
You can also follow us on [X (Twitter)](https://nitter.poast.org/edenemuofficial) for updates and announcements.
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/kXAmGCXBGD) or [Revolt](https://rvlt.gg/qKgFEAbH).
You can also follow us on [X (Twitter)](https://x.com/edenemuofficial) for updates and announcements.
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Revolt to learn more about the current state of the emulator.
@@ -82,7 +82,7 @@ Any donations received will go towards things such as:
* Additional hardware (e.g. GPUs as needed to improve rendering support, other peripherals to add support for, etc.)
* CI Infrastructure
If you would prefer to support us in a different way, please join our [Discord](https://discord.gg/HstXbPch7X) and talk to Camille or any of our other developers.
If you would prefer to support us in a different way, please join our [Discord](https://discord.gg/edenemu) and talk to Camille or any of our other developers.
## License

BIN
dist/Assets.car vendored

Binary file not shown.

View File

@@ -43,12 +43,6 @@ Various graphical filters exist - each of them aimed at a specific target/image
- **Pros**: Offers decent pixel-art upscaling.
- **Cons**: Only works for pixel-art.
### Anisotropy values
The anisotropy value is (value game wants + the set value); **Default** will use the native anisotropy value as it would be on hardware. **Automatic** sets it according to screen resolution. Turning off anisotropy is not recommended as it can break a myriad of games, however it is provided in the name of flexibility.
Values from x2, x4, x8, x16, x32 up to x64 values are provided. This should be enough to not need to revise those values in my lifetime ever again.
### External
While stock shaders offer a basic subset of options for most users, programs such as [ReShade](https://github.com/crosire/reshade) offer a more flexible experience. In addition to that users can also seek out modifications (mods) for enhancing visual experience (60 FPS mods, HDR, etc).

View File

@@ -1,12 +0,0 @@
# User Handbook - Native Application Development
Debugging on physical hardware can get tedious and time consuming. Users are empowered with the debugging capabilities of the emulator to ensure their applications run as-is on the system. To the greatest extent possible atleast.
## Debugging
**Standard key prefix**: Allows to redirect the key manager to a file other than `prod.keys` (for example `other` would redirect to `other.keys`). This is useful for testing multiple keysets. Default is `prod`.
**Changing serial**: Very basic way to set debug values for the serial (and battery number). Developers do not need to write the full serial as it will be writen in-place (that is, it will be filled with the default serial and then overwrite the serial from the beginning).
- Battery serial: `YUZU0EMULATOR14022024`
- Board serial: `YUZ10000000001`
If the user were to set their board serial as `ABC`, then it will be written in-place and the resulting serial would be `ABC10000000001`. There are no underlying checks to ensure correctness of serials other than a hard limit of 16-characters for both.

View File

@@ -11,4 +11,3 @@ This handbook is primarily aimed at the end-user - baking useful knowledge for e
- **[Testing](Testing.md)**
- **[Data, savefiles and storage](Storage.md)**
- **[Orphaned Profiles](Orphaned.md)**
- **[Native Application Development](Native.md)**

View File

@@ -27,7 +27,7 @@ set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
# Xbyak (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
if (PLATFORM_SUN OR PLATFORM_OPENBSD OR PLATFORM_NETBSD OR PLATFORM_DRAGONFLY)
if (PLATFORM_SUN OR PLATFORM_OPENBSD)
AddJsonPackage(xbyak_sun)
else()
AddJsonPackage(xbyak)

View File

@@ -121,7 +121,7 @@ else()
-Werror=unused
-Wno-attributes
-Wno-invalid-offsetof
$<$<COMPILE_LANGUAGE:CXX>:-Wno-invalid-offsetof>
-Wno-unused-parameter
-Wno-missing-field-initializers
)

View File

@@ -61,6 +61,7 @@ android {
minSdk = 24
targetSdk = 36
versionName = getGitVersion()
versionCode = autoVersion
ndk {
@@ -68,6 +69,9 @@ android {
abiFilters += listOf("arm64-v8a")
}
buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"")
buildConfigField("String", "BRANCH", "\"${getBranch()}\"")
externalNativeBuild {
cmake {
val extraCMakeArgs =
@@ -88,14 +92,14 @@ android {
"-DYUZU_TESTS=OFF",
"-DDYNARMIC_TESTS=OFF",
*extraCMakeArgs.toTypedArray()
)
)
))
abiFilters("arm64-v8a")
}
}
}
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
signingConfigs {
if (keystoreFile != null) {
@@ -158,39 +162,7 @@ android {
}
}
flavorDimensions.add("version")
productFlavors {
create("mainline") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden")
}
create("genshinSpoof") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden Optimized")
applicationId = "com.miHoYo.Yuanshen"
}
create("legacy") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden Legacy")
applicationId = "dev.legacy.eden_emulator"
externalNativeBuild {
cmake {
arguments.add("-DYUZU_LEGACY=ON")
}
}
sourceSets {
getByName("legacy") {
res.srcDirs("src/main/legacy")
}
}
}
}
// this is really annoying but idk any other ways to fix this behavior
// this is really annoying but idk any other ways to fix this behavior
applicationVariants.all {
val variant = this
when {
@@ -215,6 +187,40 @@ android {
}
}
android {
flavorDimensions.add("version")
productFlavors {
create("mainline") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden")
}
create("genshinSpoof") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden Optimized")
applicationId = "com.miHoYo.Yuanshen"
}
create("legacy") {
dimension = "version"
resValue("string", "app_name_suffixed", "Eden Legacy")
applicationId = "dev.legacy.eden_emulator"
externalNativeBuild {
cmake {
arguments.add("-DYUZU_LEGACY=ON")
}
}
sourceSets {
getByName("legacy") {
res.srcDirs("src/main/legacy")
}
}
}
}
}
externalNativeBuild {
cmake {
version = "3.22.1"
@@ -278,6 +284,7 @@ dependencies {
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.2")
implementation("androidx.window:window:1.3.0")
implementation("androidx.constraintlayout:constraintlayout:2.2.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("org.commonmark:commonmark:0.22.0")
implementation("androidx.navigation:navigation-fragment-ktx:2.8.9")
@@ -295,9 +302,7 @@ fun runGitCommand(command: List<String>): String {
.directory(project.rootDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()
.inputStream.bufferedReader()
.use { it.readText() }
.start().inputStream.bufferedReader().use { it.readText() }
.trim()
} catch (e: Exception) {
logger.error("Cannot find git")
@@ -321,3 +326,9 @@ fun getGitVersion(): String {
}
return versionName.ifEmpty { "0.0" }
}
fun getGitHash(): String =
runGitCommand(listOf("git", "rev-parse", "--short", "HEAD")).ifEmpty { "dummy-hash" }
fun getBranch(): String =
runGitCommand(listOf("git", "rev-parse", "--abbrev-ref", "HEAD")).ifEmpty { "dummy-hash" }

View File

@@ -29,7 +29,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<application
android:name="org.yuzu.yuzu_emu.YuzuApplication"
@@ -109,15 +110,5 @@ SPDX-License-Identifier: GPL-3.0-or-later
</intent-filter>
</provider>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

View File

@@ -222,21 +222,11 @@ object NativeLibrary {
*/
external fun getUpdateUrl(version: String): String
/**
* Return the URL to download the APK for the given version
*/
external fun getUpdateApkUrl(version: String, packageId: String): String
/**
* Returns whether the update checker is enabled through CMAKE options.
*/
external fun isUpdateCheckerEnabled(): Boolean
/**
* Returns the build version generated by CMake (BUILD_VERSION).
*/
external fun getBuildVersion(): String
enum class CoreError {
ErrorSystemFiles,
ErrorSavestate,

View File

@@ -235,13 +235,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
val isPhysicalKeyboard = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD &&
event.device?.isVirtual == false
if (event.source and InputDevice.SOURCE_JOYSTICK != InputDevice.SOURCE_JOYSTICK &&
event.source and InputDevice.SOURCE_GAMEPAD != InputDevice.SOURCE_GAMEPAD &&
event.source and InputDevice.SOURCE_MOUSE != InputDevice.SOURCE_MOUSE &&
!isPhysicalKeyboard
event.source and InputDevice.SOURCE_KEYBOARD != InputDevice.SOURCE_KEYBOARD &&
event.source and InputDevice.SOURCE_MOUSE != InputDevice.SOURCE_MOUSE
) {
return super.dispatchKeyEvent(event)
}

View File

@@ -30,6 +30,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
RENDERER_DEBUG("debug"),
RENDERER_VERTEX_INPUT_DYNAMIC_STATE("vertex_input_dynamic_state"),
FORCE_IDENTITY_SWIZZLE("force_identity_swizzle"),
FORCE_LDR_TO_SRGB("force_ldr_to_srgb"),
RENDERER_PROVOKING_VERTEX("provoking_vertex"),
RENDERER_DESCRIPTOR_INDEXING("descriptor_indexing"),
RENDERER_SAMPLE_SHADING("sample_shading"),
@@ -72,8 +74,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
DEBUG_FLUSH_BY_LINE("flush_line"),
USE_LRU_CACHE("use_lru_cache"),
DONT_SHOW_DRIVER_SHADER_WARNING("dont_show_driver_shader_warning"),
ENABLE_OVERLAY("enable_overlay");
DONT_SHOW_DRIVER_SHADER_WARNING("dont_show_driver_shader_warning");
// external fun isFrameSkippingEnabled(): Boolean

View File

@@ -19,6 +19,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
RENDERER_NVDEC_EMULATION("nvdec_emulation"),
RENDERER_ASTC_DECODE_METHOD("accelerate_astc"),
RENDERER_ASTC_RECOMPRESSION("astc_recompression"),
RENDERER_FORMAT_REINTERPRETATION("format_reinterpretation"),
RENDERER_ACCURACY("gpu_accuracy"),
RENDERER_RESOLUTION("resolution_setup"),
RENDERER_VSYNC("use_vsync"),
@@ -61,8 +62,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
LOGIN_SHARE_APPLET("login_share_applet_mode"),
WIFI_WEB_AUTH_APPLET("wifi_web_auth_applet_mode"),
MY_PAGE_APPLET("my_page_applet_mode"),
INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide"),
DEBUG_KNOBS("debug_knobs")
INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide")
;
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)

View File

@@ -153,6 +153,20 @@ abstract class SettingsItem(
descriptionId = R.string.vertex_input_dynamic_state_description
)
)
put(
SwitchSetting(
BooleanSetting.FORCE_IDENTITY_SWIZZLE,
titleId = R.string.force_identity_swizzle,
descriptionId = R.string.force_identity_swizzle_description
)
)
put(
SwitchSetting(
BooleanSetting.FORCE_LDR_TO_SRGB,
titleId = R.string.force_ldr_to_srgb,
descriptionId = R.string.force_ldr_to_srgb_description
)
)
put(
SwitchSetting(
BooleanSetting.RENDERER_DESCRIPTOR_INDEXING,
@@ -366,6 +380,14 @@ abstract class SettingsItem(
valuesId = R.array.astcRecompressionMethodValues
)
)
put(
SingleChoiceSetting(
IntSetting.RENDERER_FORMAT_REINTERPRETATION,
titleId = R.string.format_reinterpretation,
choicesId = R.array.formatReinterpretationNames,
valuesId = R.array.formatReinterpretationValues
)
)
put(
SingleChoiceSetting(
IntSetting.RENDERER_VRAM_USAGE_MODE,
@@ -762,7 +784,6 @@ abstract class SettingsItem(
SwitchSetting(
BooleanSetting.ENABLE_UPDATE_CHECKS,
titleId = R.string.enable_update_checks,
descriptionId = R.string.enable_update_checks_description,
)
)
put(
@@ -788,16 +809,6 @@ abstract class SettingsItem(
descriptionId = R.string.use_auto_stub_description
)
)
put(
SpinBoxSetting(
IntSetting.DEBUG_KNOBS,
titleId = R.string.debug_knobs,
descriptionId = R.string.debug_knobs_description,
valueHint = R.string.debug_knobs_hint,
min = 0,
max = 65535
)
)
val fastmem = object : AbstractBooleanSetting {
override fun getBoolean(needsGlobal: Boolean): Boolean =
@@ -849,14 +860,7 @@ abstract class SettingsItem(
descriptionId = R.string.airplane_mode_description
)
)
put(
SwitchSetting(
BooleanSetting.ENABLE_OVERLAY,
titleId = R.string.enable_overlay,
descriptionId = R.string.enable_overlay_description
)
)
}
}
}

View File

@@ -186,12 +186,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
updateButtonState(isValid)
}
/*
* xbzk: these two events, along with attachRepeat feature,
* were causing spinbox buttons to respond twice per press
* cutting these out to retain accelerated press functionality
* TODO: clean this out later if no issues arise
*
spinboxBinding.buttonDecrement.setOnClickListener {
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
val newValue = current - 1
@@ -205,7 +199,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
spinboxBinding.editValue.setText(newValue.toString())
updateValidity(newValue)
}
*/
fun attachRepeat(button: View, delta: Int) {
val handler = Handler(Looper.getMainLooper())

View File

@@ -453,7 +453,6 @@ class SettingsFragmentPresenter(
sl.apply {
add(HeaderSetting(R.string.veil_extensions))
add(ByteSetting.RENDERER_DYNA_STATE.key)
add(BooleanSetting.RENDERER_VERTEX_INPUT_DYNAMIC_STATE.key)
add(BooleanSetting.RENDERER_PROVOKING_VERTEX.key)
add(BooleanSetting.RENDERER_DESCRIPTOR_INDEXING.key)
add(BooleanSetting.RENDERER_SAMPLE_SHADING.key)
@@ -470,6 +469,10 @@ class SettingsFragmentPresenter(
add(IntSetting.RENDERER_NVDEC_EMULATION.key)
add(IntSetting.RENDERER_ASTC_DECODE_METHOD.key)
add(IntSetting.RENDERER_ASTC_RECOMPRESSION.key)
add(IntSetting.RENDERER_FORMAT_REINTERPRETATION.key)
add(BooleanSetting.RENDERER_VERTEX_INPUT_DYNAMIC_STATE.key)
add(BooleanSetting.FORCE_IDENTITY_SWIZZLE.key)
add(BooleanSetting.FORCE_LDR_TO_SRGB.key)
add(IntSetting.RENDERER_VRAM_USAGE_MODE.key)
add(IntSetting.RENDERER_OPTIMIZE_SPIRV_OUTPUT.key)
@@ -491,7 +494,6 @@ class SettingsFragmentPresenter(
sl.apply {
add(IntSetting.SWKBD_APPLET.key)
add(BooleanSetting.AIRPLANE_MODE.key)
add(BooleanSetting.ENABLE_OVERLAY.key)
}
}
private fun addInputPlayer(sl: ArrayList<SettingsItem>, playerIndex: Int) {
@@ -1168,10 +1170,9 @@ class SettingsFragmentPresenter(
add(IntSetting.CPU_ACCURACY.key)
add(BooleanSetting.USE_AUTO_STUB.key)
add(SettingsItem.FASTMEM_COMBINED)
add(HeaderSetting(R.string.log))
add(BooleanSetting.DEBUG_FLUSH_BY_LINE.key)
add(HeaderSetting(R.string.general))
add(IntSetting.DEBUG_KNOBS.key)
}
}
}

View File

@@ -29,7 +29,6 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding
import org.yuzu.yuzu_emu.model.HomeViewModel
import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins
import org.yuzu.yuzu_emu.NativeLibrary
class AboutFragment : Fragment() {
private var _binding: FragmentAboutBinding? = null
@@ -79,15 +78,11 @@ class AboutFragment : Fragment() {
binding.root.findNavController().navigate(R.id.action_aboutFragment_to_licensesFragment)
}
val buildName = getString(R.string.app_name_suffixed)
val buildVersion = NativeLibrary.getBuildVersion()
val fullVersionText = "$buildName ($buildVersion)"
binding.textVersionName.text = fullVersionText
binding.textVersionName.text = BuildConfig.VERSION_NAME
binding.buttonVersionName.setOnClickListener {
val clipBoard =
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(getString(R.string.build), fullVersionText)
val clip = ClipData.newPlainText(getString(R.string.build), BuildConfig.GIT_HASH)
clipBoard.setPrimaryClip(clip)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {

View File

@@ -145,12 +145,13 @@ class GamePropertiesFragment : Fragment() {
val seconds = playTimeSeconds % 60
val readablePlayTime = when {
hours > 0 -> "$hours${getString(R.string.hours_abbr)} $minutes${getString(R.string.minutes_abbr)} $seconds${getString(R.string.seconds_abbr)}"
minutes > 0 -> "$minutes${getString(R.string.minutes_abbr)} $seconds${getString(R.string.seconds_abbr)}"
else -> "$seconds${getString(R.string.seconds_abbr)}"
}
hours > 0 -> "${hours}h ${minutes}m ${seconds}s"
minutes > 0 -> "${minutes}m ${seconds}s"
else -> "${seconds}s"
}
append(getString(R.string.playtime) + " " + readablePlayTime)
append(getString(R.string.playtime))
append(readablePlayTime)
}
binding.playtime.setOnClickListener {

View File

@@ -53,7 +53,6 @@ class GamesFragment : Fragment() {
private var originalHeaderLeftMargin: Int? = null
private var lastViewType: Int = GameAdapter.VIEW_TYPE_GRID
private var fallbackBottomInset: Int = 0
companion object {
private const val SEARCH_TEXT = "SearchText"
@@ -209,12 +208,12 @@ class GamesFragment : Fragment() {
else -> throw IllegalArgumentException("Invalid view type: $savedViewType")
}
if (savedViewType == GameAdapter.VIEW_TYPE_CAROUSEL) {
(binding.gridGames as? View)?.let { it -> ViewCompat.requestApplyInsets(it)}
doOnNextLayout { //Carousel: important to avoid overlap issues
(this as? CarouselRecyclerView)?.notifyLaidOut(fallbackBottomInset)
doOnNextLayout {
(this as? CarouselRecyclerView)?.setCarouselMode(true, gameAdapter)
adapter = gameAdapter
}
} else {
(this as? CarouselRecyclerView)?.setupCarousel(false)
(this as? CarouselRecyclerView)?.setCarouselMode(false)
}
adapter = gameAdapter
lastViewType = savedViewType
@@ -238,8 +237,9 @@ class GamesFragment : Fragment() {
override fun onResume() {
super.onResume()
if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) {
(binding.gridGames as? CarouselRecyclerView)?.setupCarousel(true)
(binding.gridGames as? CarouselRecyclerView)?.restoreScrollState(gamesViewModel.lastScrollPosition)
(binding.gridGames as? CarouselRecyclerView)?.restoreScrollState(
gamesViewModel.lastScrollPosition
)
}
}
@@ -494,11 +494,6 @@ class GamesFragment : Fragment() {
mlpFab.rightMargin = rightInset + fabPadding
binding.addDirectory.layoutParams = mlpFab
val navInsets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars())
val gestureInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemGestures())
val bottomInset = maxOf(navInsets.bottom, gestureInsets.bottom, cutoutInsets.bottom)
fallbackBottomInset = bottomInset
(binding.gridGames as? CarouselRecyclerView)?.notifyInsetsReady(bottomInset)
windowInsets
}
}

View File

@@ -53,16 +53,8 @@ import androidx.core.content.edit
import org.yuzu.yuzu_emu.activities.EmulationActivity
import kotlin.text.compareTo
import androidx.core.net.toUri
import com.google.android.material.progressindicator.LinearProgressIndicator
import com.google.android.material.textview.MaterialTextView
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.updater.APKDownloader
import org.yuzu.yuzu_emu.updater.APKInstaller
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class MainActivity : AppCompatActivity(), ThemeProvider {
private lateinit var binding: ActivityMainBinding
@@ -194,7 +186,9 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
.setTitle(R.string.update_available)
.setMessage(getString(R.string.update_available_description, version))
.setPositiveButton(android.R.string.ok) { _, _ ->
downloadAndInstallUpdate(version)
val url = NativeLibrary.getUpdateUrl(version)
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
startActivity(intent)
}
.setNeutralButton(R.string.cancel) { dialog, _ ->
dialog.dismiss()
@@ -207,87 +201,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
.show()
}
private fun downloadAndInstallUpdate(version: String) {
CoroutineScope(Dispatchers.IO).launch {
val packageId = applicationContext.packageName
val apkUrl = NativeLibrary.getUpdateApkUrl(version, packageId)
val apkFile = File(cacheDir, "update-$version.apk")
withContext(Dispatchers.Main) {
showDownloadProgressDialog()
}
val downloader = APKDownloader(apkUrl, apkFile)
downloader.download(
onProgress = { progress ->
runOnUiThread {
updateDownloadProgress(progress)
}
},
onComplete = { success ->
runOnUiThread {
dismissDownloadProgressDialog()
if (success) {
val installer = APKInstaller(this@MainActivity)
installer.install(
apkFile,
onComplete = {
Toast.makeText(
this@MainActivity,
R.string.update_installed_successfully,
Toast.LENGTH_LONG
).show()
},
onFailure = { exception ->
Toast.makeText(
this@MainActivity,
getString(R.string.update_install_failed, exception.message),
Toast.LENGTH_LONG
).show()
}
)
} else {
Toast.makeText(
this@MainActivity,
getString(R.string.update_download_failed) + "\n\nURL: $apkUrl",
Toast.LENGTH_LONG
).show()
}
}
}
)
}
}
private var progressDialog: androidx.appcompat.app.AlertDialog? = null
private var progressBar: LinearProgressIndicator? = null
private var progressMessage: MaterialTextView? = null
private fun showDownloadProgressDialog() {
val progressView = layoutInflater.inflate(R.layout.dialog_download_progress, null)
progressBar = progressView.findViewById(R.id.download_progress_bar)
progressMessage = progressView.findViewById(R.id.download_progress_message)
progressDialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.downloading_update)
.setView(progressView)
.setCancelable(false)
.create()
progressDialog?.show()
}
private fun updateDownloadProgress(progress: Int) {
progressBar?.progress = progress
progressMessage?.text = "$progress%"
}
private fun dismissDownloadProgressDialog() {
progressDialog?.dismiss()
progressDialog = null
progressBar = null
progressMessage = null
}
fun displayMultiplayerDialog() {
val dialog = NetPlayDialog(this)

View File

@@ -1,61 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.updater
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
class APKDownloader(private val url: String, private val outputFile: File) {
fun download(onProgress: (Int) -> Unit, onComplete: (Boolean) -> Unit) {
val client = OkHttpClient()
val request = Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
onComplete(false)
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
response.body?.let { body ->
val contentLength = body.contentLength()
try {
val inputStream = body.byteStream()
val outputStream = FileOutputStream(outputFile)
val buffer = ByteArray(4096)
var bytesRead: Int
var totalBytesRead: Long = 0
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
outputStream.write(buffer, 0, bytesRead)
totalBytesRead += bytesRead
val progress = (totalBytesRead * 100 / contentLength).toInt()
onProgress(progress)
}
outputStream.flush()
outputStream.close()
inputStream.close()
onComplete(true)
} catch (e: IOException) {
e.printStackTrace()
onComplete(false)
}
} ?: run {
onComplete(false)
}
} else {
onComplete(false)
}
}
})
}
}

View File

@@ -1,41 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.updater
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import androidx.core.content.FileProvider
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.io.File
class APKInstaller(private val context: Context) {
fun install(apkFile: File, onComplete: () -> Unit, onFailure: (Exception) -> Unit) {
try {
val apkUri: Uri = FileProvider.getUriForFile(
context,
context.applicationContext.packageName + ".provider",
apkFile
)
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
GlobalScope.launch {
val receiver = AppInstallReceiver(onComplete, onFailure)
context.registerReceiver(receiver, IntentFilter().apply {
addAction(Intent.ACTION_PACKAGE_ADDED)
addAction(Intent.ACTION_PACKAGE_REPLACED)
addDataScheme("package")
})
}
} catch (e: Exception) {
onFailure(e)
}
}
}

View File

@@ -1,30 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.updater
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class AppInstallReceiver(
private val onComplete: () -> Unit,
private val onFailure: (Exception) -> Unit
) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val packageName = intent.data?.schemeSpecificPart
when (intent.action) {
Intent.ACTION_PACKAGE_ADDED, Intent.ACTION_PACKAGE_REPLACED -> {
Log.i("AppInstallReceiver", "Package installed or updated: $packageName")
onComplete()
context.unregisterReceiver(this)
}
else -> {
onFailure(Exception("Installation failed for package: $packageName"))
context.unregisterReceiver(this)
}
}
}
}

View File

@@ -20,8 +20,9 @@ import androidx.core.view.doOnNextLayout
import org.yuzu.yuzu_emu.YuzuApplication
import androidx.preference.PreferenceManager
import androidx.core.view.WindowInsetsCompat
/**
* CarouselRecyclerView encapsulates all carousel content for the games UI.
* CarouselRecyclerView encapsulates all carousel logic for the games UI.
* It manages overlapping cards, center snapping, custom drawing order,
* joypad & fling navigation and mid-screen swipe-to-refresh.
*/
@@ -33,7 +34,6 @@ class CarouselRecyclerView @JvmOverloads constructor(
private var overlapFactor: Float = 0f
private var overlapPx: Int = 0
private var bottomInset: Int = -1
private var overlapDecoration: OverlappingDecoration? = null
private var pagerSnapHelper: PagerSnapHelper? = null
private var scalingScrollListener: OnScrollListener? = null
@@ -202,61 +202,46 @@ class CarouselRecyclerView @JvmOverloads constructor(
}
}
fun refreshView() {
updateChildScalesAndAlpha()
focusCenteredCard()
}
fun notifyInsetsReady(newBottomInset: Int) {
if (bottomInset != newBottomInset) {
bottomInset = newBottomInset
}
setupCarousel(true)
}
fun notifyLaidOut(fallBackBottomInset: Int) {
if (bottomInset < 0) bottomInset = fallBackBottomInset
var gameAdapter = adapter as? GameAdapter ?: return
var newCardSize = cardSize(bottomInset)
if (gameAdapter.cardSize != newCardSize) {
gameAdapter.setCardSize(newCardSize)
}
setupCarousel(true)
}
fun cardSize(bottomInset: Int): Int {
val internalFactor = resources.getFraction(R.fraction.carousel_card_size_factor, 1, 1)
val userFactor = preferences.getFloat(CAROUSEL_CARD_SIZE_FACTOR, internalFactor).coerceIn(
0f,
1f
)
return (userFactor * (height - bottomInset)).toInt()
}
fun setupCarousel(enabled: Boolean) {
fun setCarouselMode(enabled: Boolean, gameAdapter: GameAdapter? = null) {
if (enabled) {
val gameAdapter = adapter as? GameAdapter ?: return
if (gameAdapter.cardSize == 0) return
if (bottomInset < 0) return
useCustomDrawingOrder = true
val cardSize = gameAdapter.cardSize
val internalOverlapFactor = resources.getFraction(R.fraction.carousel_overlap_factor,1,1)
overlapFactor = preferences.getFloat(CAROUSEL_OVERLAP_FACTOR, internalOverlapFactor).coerceIn(0f,1f)
val insets = rootWindowInsets?.let { WindowInsetsCompat.toWindowInsetsCompat(it, this) }
val bottomInset = insets?.getInsets(WindowInsetsCompat.Type.systemBars())?.bottom ?: 0
val internalFactor = resources.getFraction(R.fraction.carousel_card_size_factor, 1, 1)
val userFactor = preferences.getFloat(CAROUSEL_CARD_SIZE_FACTOR, internalFactor).coerceIn(
0f,
1f
)
val cardSize = (userFactor * (height - bottomInset)).toInt()
gameAdapter?.setCardSize(cardSize)
val internalOverlapFactor = resources.getFraction(
R.fraction.carousel_overlap_factor,
1,
1
)
overlapFactor = preferences.getFloat(CAROUSEL_OVERLAP_FACTOR, internalOverlapFactor).coerceIn(
0f,
1f
)
overlapPx = (cardSize * overlapFactor).toInt()
val internalFlingMultiplier = resources.getFraction(R.fraction.carousel_fling_multiplier,1,1)
val internalFlingMultiplier = resources.getFraction(
R.fraction.carousel_fling_multiplier,
1,
1
)
flingMultiplier = preferences.getFloat(
CAROUSEL_FLING_MULTIPLIER,
internalFlingMultiplier
).coerceIn(1f, 5f)
gameAdapter .registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
gameAdapter?.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
if (pendingScrollAfterReload) {
doOnNextLayout {
refreshView()
post {
jigglyScroll()
pendingScrollAfterReload = false
}
}
@@ -272,7 +257,7 @@ class CarouselRecyclerView @JvmOverloads constructor(
addItemDecoration(overlapDecoration!!)
}
// Gradual scaling on scroll
// Gradual scalingAdd commentMore actions
if (scalingScrollListener == null) {
scalingScrollListener = object : OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
@@ -330,7 +315,8 @@ class CarouselRecyclerView @JvmOverloads constructor(
super.scrollToPosition(position)
(layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(position, overlapPx)
doOnNextLayout {
refreshView()
updateChildScalesAndAlpha()
focusCenteredCard()
}
}
@@ -396,6 +382,12 @@ class CarouselRecyclerView @JvmOverloads constructor(
return sorted[i].first
}
fun jigglyScroll() {
scrollBy(-1, 0)
scrollBy(1, 0)
focusCenteredCard()
}
inner class OverlappingDecoration(private val overlap: Int) : ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,

View File

@@ -1613,43 +1613,6 @@ JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateUrl(
env->ReleaseStringUTFChars(version, version_str);
return env->NewStringUTF(url.c_str());
}
JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateApkUrl(
JNIEnv* env,
jobject obj,
jstring version,
jstring packageId) {
const char* version_str = env->GetStringUTFChars(version, nullptr);
const char* package_id_str = env->GetStringUTFChars(packageId, nullptr);
std::string variant;
std::string package_id(package_id_str);
if (package_id.find("dev.legacy.eden_emulator") != std::string::npos) {
variant = "legacy";
} else if (package_id.find("com.miHoYo.Yuanshen") != std::string::npos) {
variant = "optimized";
} else {
variant = "standard";
}
const std::string apk_filename = fmt::format("Eden-Android-{}-{}.apk", version_str, variant);
const std::string url = fmt::format("{}/{}/releases/download/{}/{}",
std::string{Common::g_build_auto_update_website},
std::string{Common::g_build_auto_update_repo},
version_str,
apk_filename);
env->ReleaseStringUTFChars(version, version_str);
env->ReleaseStringUTFChars(packageId, package_id_str);
return env->NewStringUTF(url.c_str());
}
#endif
JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getBuildVersion(
JNIEnv* env,
[[maybe_unused]] jobject obj) {
return env->NewStringUTF(Common::g_build_version);
}
} // extern "C"

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/download_progress_message"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="0%"
android:textAlignment="center"
android:textSize="18sp"
android:textStyle="bold" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/download_progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"
app:indicatorColor="?attr/colorPrimary"
app:trackColor="?attr/colorSurfaceVariant"
app:trackCornerRadius="4dp"
app:trackThickness="8dp" />
</LinearLayout>

View File

@@ -1016,13 +1016,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">خلفيات سوداء</string>

View File

@@ -727,13 +727,10 @@
<string name="theme_mode_dark">تاریک</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">پاشبنەمای ڕەش</string>

View File

@@ -693,13 +693,10 @@
<string name="theme_mode_dark">Tmavé</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Černá pozadí</string>

View File

@@ -912,13 +912,10 @@ Wirklich fortfahren?</string>
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Schwarze Hintergründe</string>

View File

@@ -975,13 +975,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">x2</string>
<string name="multiplier_four">x4</string>
<string name="multiplier_eight">x8</string>
<string name="multiplier_sixteen">x16</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Fondos oscuros</string>

View File

@@ -861,13 +861,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">پس‌زمینه مشکی</string>

View File

@@ -988,13 +988,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Arrière-plan noir</string>

View File

@@ -776,13 +776,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">רקעים שחורים</string>

View File

@@ -875,13 +875,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Fekete háttér</string>

View File

@@ -929,13 +929,10 @@
<string name="cubeb">Cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Gunakan Latar Belakang Hitam</string>

View File

@@ -988,13 +988,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Sfondi neri</string>

View File

@@ -778,13 +778,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">完全な黒を使用</string>

View File

@@ -837,13 +837,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">검정 배경</string>

View File

@@ -740,13 +740,10 @@
<string name="theme_mode_dark">Mørk</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Svart bakgrunn</string>

View File

@@ -1012,13 +1012,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Czarne tła</string>

View File

@@ -976,13 +976,10 @@ uma tentativa de mapeamento automático</string>
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Planos de fundo pretos</string>

View File

@@ -890,13 +890,10 @@ uma tentativa de mapeamento automático</string>
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Plano de fundo preto</string>

View File

@@ -1010,13 +1010,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Чёрный фон</string>

View File

@@ -888,13 +888,10 @@
<string name="cubeb">Цубеб</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2к</string>
<string name="multiplier_four">4к</string>
<string name="multiplier_eight">8к</string>
<string name="multiplier_sixteen">16к</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Црна позадина</string>

View File

@@ -1012,13 +1012,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Чорний фон</string>

View File

@@ -740,13 +740,10 @@
<string name="theme_mode_dark">Tối</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Nền tối</string>

View File

@@ -984,13 +984,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">使用黑色背景</string>

View File

@@ -984,13 +984,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">黑色背景</string>

View File

@@ -161,6 +161,22 @@
<item>2</item> <!-- BC3 -->
</integer-array>
<!-- Format Reinterpretation Choices -->
<string-array name="formatReinterpretationNames">
<item>@string/format_reinterpretation_disabled</item>
<item>@string/format_reinterpretation_r32uint_to_r32sfloat</item>
<item>@string/format_reinterpretation_r32sint_to_r32uint</item>
<item>@string/format_reinterpretation_r32sfloat_to_r32sint</item>
</string-array>
<!-- Format Reinterpretation Values -->
<integer-array name="formatReinterpretationValues">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</integer-array>
<!-- NVDEC Emulation Choices -->
<string-array name="rendererNvdecNames">
<item>@string/nvdec_emulation_none</item> <!-- Off -->
@@ -487,13 +503,10 @@
<string-array name="anisoEntries">
<item>@string/auto</item>
<item>@string/slider_default</item>
<item>@string/multiplier_x2</item>
<item>@string/multiplier_x4</item>
<item>@string/multiplier_x8</item>
<item>@string/multiplier_x16</item>
<item>@string/multiplier_x32</item>
<item>@string/multiplier_x64</item>
<item>@string/multiplier_none</item>
<item>@string/multiplier_two</item>
<item>@string/multiplier_four</item>
<item>@string/multiplier_eight</item>
<item>@string/multiplier_sixteen</item>
</string-array>
<integer-array name="anisoValues">
<item>0</item>

View File

@@ -94,10 +94,10 @@
<string name="dyna_state">Extended Dynamic State</string>
<string name="dyna_state_description">Controls the number of features that can be used in Extended Dynamic State. Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. The default value may vary depending on your system and hardware capabilities. This value can be changed until stability and a better visual quality are achieved.</string>
<string name="disabled">Disabled</string>
<string name="vertex_input_dynamic_state">Vertex Input Dynamic State</string>
<string name="vertex_input_dynamic_state_description">Enables vertex input dynamic state feature for better quality and performance.</string>
<string name="provoking_vertex">Provoking Vertex</string>
<string name="provoking_vertex_description">Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs.</string>
<string name="vertex_input_dynamic_state">Vertex Input Dynamic State</string>
<string name="vertex_input_dynamic_state_description">Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs.</string>
<string name="descriptor_indexing">Descriptor Indexing</string>
<string name="descriptor_indexing_description">Improves texture and buffer handling, as well as the Maxwell translation layer. Supported by some Vulkan 1.1 GPUs and all Vulkan 1.2+ GPUs.</string>
<string name="sample_shading">Sample Shading</string>
@@ -135,9 +135,6 @@
<string name="memory_layout_description">(EXPERIMENTAL) Change the emulated memory layout. This setting will not increase performance, but may help with games utilizing high resolutions via mods. Do not use on phones with 8GB of RAM or less. Only works on the Dynarmic (JIT) backend.</string>
<string name="dma_accuracy">DMA Accuracy</string>
<string name="dma_accuracy_description">Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. If unsure, leave this on Default.</string>
<string name="debug_knobs">Debug knobs</string>
<string name="debug_knobs_description">For development use only.</string>
<string name="debug_knobs_hint">0 to 65535</string>
<!-- Shader Backend -->
<string name="shader_backend">Shader Backend</string>
@@ -274,14 +271,9 @@
<string name="folder">Folder</string>
<string name="dont_show_again">Don\'t Show Again</string>
<string name="add_directory_success">New game directory added successfully </string>
<string name="enable_update_checks">Check for Updates</string>
<string name="enable_update_checks_description">Check for updates on launch, and optionally download and install the new update.</string>
<string name="enable_update_checks">Check for updates on app startup.</string>
<string name="update_available">Update Available</string>
<string name="update_available_description">A new version is available: %1$s\n\nWould you like to download it?</string>
<string name="downloading_update">Downloading Update</string>
<string name="update_download_failed">Failed to download update</string>
<string name="update_installed_successfully">Update installed successfully</string>
<string name="update_install_failed">Failed to install update: %1$s</string>
<string name="home_search">Search</string>
<string name="home_settings">Settings</string>
<string name="empty_gamelist">No files were found or no game directory has been selected yet.</string>
@@ -451,9 +443,9 @@
<string name="user_data_import_success">User data imported successfully</string>
<string name="user_data_export_cancelled">Export cancelled</string>
<string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string>
<string name="discord_link" translatable="false">https://discord.gg/HstXbPch7X</string>
<string name="discord_link" translatable="false">https://discord.gg/kXAmGCXBGD</string>
<string name="revolt_link" translatable="false">https://rvlt.gg/qKgFEAbH</string>
<string name="x_link" translatable="false">https://nitter.poast.org/edenemuofficial</string>
<string name="x_link" translatable="false">https://x.com/edenemuofficial</string>
<string name="website_link" translatable="false">https://eden-emu.dev</string>
<string name="github_link" translatable="false">https://git.eden-emu.dev/eden-emu</string>
@@ -537,8 +529,6 @@
<string name="flush_by_line">Flush debug logs by line</string>
<string name="flush_by_line_description">Flushes debugging logs on each line written, making debugging easier in cases of crashing or freezing.</string>
<string name="general">General</string>
<!-- Audio settings strings -->
<string name="audio_output_engine">Output engine</string>
<string name="audio_volume">Volume</string>
@@ -718,7 +708,7 @@
<string name="copy_details">Copy details</string>
<string name="add_ons">Add-ons</string>
<string name="add_ons_description">Toggle mods, updates and DLC</string>
<string name="playtime">Playtime:</string>
<string name="playtime">Playtime: </string>
<string name="reset_playtime">Clear Playtime</string>
<string name="reset_playtime_description">Reset the current game\'s playtime back to 0 seconds</string>
<string name="reset_playtime_warning_description">This will clear the current game\'s playtime data. Are you sure?</string>
@@ -726,9 +716,6 @@
<string name="edit_playtime">Edit Playtime</string>
<string name="hours">Hours</string>
<string name="minutes">Minutes</string>
<string name="hours_abbr">h</string>
<string name="minutes_abbr">m</string>
<string name="seconds_abbr">s</string>
<string name="hours_must_be_between_0_and_9999">Hours must be between 0 and 9999</string>
<string name="minutes_must_be_between_0_and_59">Minutes must be between 0 and 59</string>
<string name="seconds_must_be_between_0_and_59">Seconds must be between 0 and 59</string>
@@ -958,7 +945,22 @@
<string name="astc_recompression_bc1">BC1 (Low Quality)</string>
<string name="astc_recompression_bc3">BC3 (Medium Quality)</string>
<!-- ASTC Recompression Method Choices -->
<!-- Format Reinterpretation -->
<string name="format_reinterpretation">Format Reinterpretation</string>
<string name="format_reinterpretation_disabled">Disabled</string>
<string name="format_reinterpretation_r32uint_to_r32sfloat">R32 UInt to R32 SFloat</string>
<string name="format_reinterpretation_r32sint_to_r32uint">R32 SInt to R32 UInt</string>
<string name="format_reinterpretation_r32sfloat_to_r32sint">R32 SFloat to R32 SInt</string>
<!-- Force Identity Swizzle -->
<string name="force_identity_swizzle">Force Identity Swizzle</string>
<string name="force_identity_swizzle_description">Forces identity component swizzle for storage and input attachment images. Required by Vulkan spec. Disable if graphical issues.</string>
<!-- Force LDR to sRGB -->
<string name="force_ldr_to_srgb">Force LDR to sRGB</string>
<string name="force_ldr_to_srgb_description">Converts LDR texture formats to sRGB for proper gamma correction. Fixes washed out colors on Adreno GPUs. Enable if textures look too bright or desaturated.</string>
<!-- VRAM Usage Mode -->
<string name="vram_usage_mode">VRAM Usage Mode</string>
<string name="vram_usage_mode_description">Control how aggressively the emulator allocates and frees GPU memory.</string>
<string name="vram_usage_conservative">Conservative</string>
@@ -1055,13 +1057,10 @@
<string name="cubeb">cubeb</string>
<!-- Anisotropic filtering options -->
<string name="multiplier_x2">x2</string>
<string name="multiplier_x4">x4</string>
<string name="multiplier_x8">x8</string>
<string name="multiplier_x16">x16</string>
<string name="multiplier_x32">x32</string>
<string name="multiplier_x64">x64</string>
<string name="multiplier_none">None</string>
<string name="multiplier_two">2x</string>
<string name="multiplier_four">4x</string>
<string name="multiplier_eight">8x</string>
<string name="multiplier_sixteen">16x</string>
<!-- Black backgrounds theme -->
<string name="use_black_backgrounds">Black backgrounds</string>
@@ -1125,7 +1124,7 @@
<!-- Applet Modes -->
<string name="applets_menu">Applets</string>
<string name="applets_menu_description">Change applet frontends and settings</string>
<string name="applets_menu_description">(WIP) Change applet frontends and settings</string>
<string name="applet_hle">Custom Frontend</string>
<string name="applet_lle">Real Applet</string>
@@ -1135,9 +1134,6 @@
<string name="airplane_mode">Airplane Mode</string>
<string name="airplane_mode_description">Passes Airplane Mode to the Switch OS</string>
<string name="enable_overlay">Enable Overlay Applet</string>
<string name="enable_overlay_description">Enables Horizon\'s built-in overlay applet. Press and hold the home button for 1 second to show it.</string>
<!-- Licenses screen strings -->
<string name="licenses">Licenses</string>
<string name="license_fidelityfx_fsr" translatable="false">FidelityFX-FSR</string>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- this is required to share files in the app's internal storage -->
<cache-path name="apk_cache" path="." />
<external-cache-path name="external_apk_cache" path="." />
<files-path name="files" path="." />
<external-files-path name="external_files" path="." />
</paths>

View File

@@ -22,21 +22,33 @@ void AssertFailSoftImpl();
#define YUZU_NO_INLINE __attribute__((noinline))
#endif
#define ASSERT(_a_) \
([&]() YUZU_NO_INLINE { \
if (!(_a_)) [[unlikely]] { \
LOG_CRITICAL(Debug, "Assert"); \
AssertFailSoftImpl(); \
} \
}())
#define ASSERT_MSG(_a_, ...) \
([&]() YUZU_NO_INLINE { \
if (!(_a_)) [[unlikely]] { \
LOG_CRITICAL(Debug, __FILE__ ": assert\n" __VA_ARGS__); \
AssertFailSoftImpl(); \
LOG_CRITICAL(Debug, "Assert\n" __VA_ARGS__); \
AssertFailSoftImpl(); \
} \
}())
#define ASSERT(_a_) ASSERT_MSG(_a_, "{}", #_a_)
#define UNREACHABLE() \
do { \
LOG_CRITICAL(Debug, "Unreachable"); \
AssertFatalImpl(); \
} while (0)
#define UNREACHABLE_MSG(...) \
do { \
LOG_CRITICAL(Debug, __FILE__ ": unreachable\n" __VA_ARGS__); \
AssertFatalImpl(); \
LOG_CRITICAL(Debug, "Unreachable\n" __VA_ARGS__); \
AssertFatalImpl(); \
} while (0)
#define UNREACHABLE() UNREACHABLE_MSG("")
#ifdef _DEBUG
#define DEBUG_ASSERT(_a_) ASSERT(_a_)
@@ -57,11 +69,19 @@ void AssertFailSoftImpl();
#define UNIMPLEMENTED_IF_MSG(cond, ...) ASSERT_MSG(!(cond), __VA_ARGS__)
// If the assert is ignored, execute _b_
#define ASSERT_OR_EXECUTE_MSG(_a_, _b_, ...) \
#define ASSERT_OR_EXECUTE(_a_, _b_) \
do { \
ASSERT_MSG(_a_, __VA_ARGS__); \
if (!(_a_)) { _b_ } \
ASSERT(_a_); \
if (!(_a_)) [[unlikely]] { \
_b_ \
} \
} while (0)
// If the assert is ignored, execute _b_
#define ASSERT_OR_EXECUTE(_a_, _b_) ASSERT_OR_EXECUTE_MSG(_a_, _b_, "{}", #_a_)
#define ASSERT_OR_EXECUTE_MSG(_a_, _b_, ...) \
do { \
ASSERT_MSG(_a_, __VA_ARGS__); \
if (!(_a_)) [[unlikely]] { \
_b_ \
} \
} while (0)

View File

@@ -730,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;
@@ -741,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;
}
@@ -751,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;
}

View File

@@ -50,7 +50,8 @@ constexpr const char* TrimSourcePath(std::string_view source) {
}
/// @brief Interface for logging backends.
struct Backend {
class Backend {
public:
virtual ~Backend() = default;
virtual void Write(const Entry& entry) = 0;
virtual void EnableForStacktrace() = 0;
@@ -58,7 +59,8 @@ struct Backend {
};
/// @brief Backend that writes to stderr and with color
struct ColorConsoleBackend final : public Backend {
class ColorConsoleBackend final : public Backend {
public:
explicit ColorConsoleBackend() = default;
~ColorConsoleBackend() override = default;
@@ -84,15 +86,16 @@ private:
};
/// @brief Backend that writes to a file passed into the constructor
struct FileBackend final : public Backend {
class FileBackend final : public Backend {
public:
explicit FileBackend(const std::filesystem::path& filename) {
auto old_filename = filename;
old_filename += ".old.txt";
// Existence checks are done within the functions themselves.
// We don't particularly care if these succeed or not.
void(FS::RemoveFile(old_filename));
void(FS::RenameFile(filename, old_filename));
static_cast<void>(FS::RemoveFile(old_filename));
static_cast<void>(FS::RenameFile(filename, old_filename));
file = std::make_unique<FS::IOFile>(filename, FS::FileAccessMode::Write, FS::FileType::TextFile);
}
@@ -162,34 +165,51 @@ private:
bool enabled = true;
};
#ifdef _WIN32
/// @brief Backend that writes to Visual Studio's output window
struct DebuggerBackend final : public Backend {
/**
* Backend that writes to Visual Studio's output window
*/
class DebuggerBackend final : public Backend {
public:
explicit DebuggerBackend() = default;
~DebuggerBackend() override = default;
void Write(const Entry& entry) override {
#ifdef _WIN32
::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str());
#endif
}
void Flush() override {}
void EnableForStacktrace() override {}
};
#endif
#ifdef ANDROID
/// @brief Backend that writes to the Android logcat
struct LogcatBackend : public Backend {
/**
* Backend that writes to the Android logcat
*/
class LogcatBackend : public Backend {
public:
explicit LogcatBackend() = default;
~LogcatBackend() override = default;
void Write(const Entry& entry) override {
PrintMessageToLogcat(entry);
}
void Flush() override {}
void EnableForStacktrace() override {}
};
#endif
bool initialization_in_progress_suppress_logging = true;
/// @brief Static state as a singleton.
/**
* Static state as a singleton.
*/
class Impl {
public:
static Impl& Instance() {
@@ -208,7 +228,8 @@ public:
void(CreateDir(log_dir));
Filter filter;
filter.ParseFilterString(Settings::values.log_filter.GetValue());
instance = std::unique_ptr<Impl, decltype(&Deleter)>(new Impl(log_dir / LOG_FILE, filter), Deleter);
instance = std::unique_ptr<Impl, decltype(&Deleter)>(new Impl(log_dir / LOG_FILE, filter),
Deleter);
initialization_in_progress_suppress_logging = false;
}
@@ -255,14 +276,13 @@ private:
Common::SetCurrentThreadName("Logger");
Entry entry;
const auto write_logs = [this, &entry]() {
ForEachBackend([&entry](Backend& backend) {
backend.Write(entry);
});
ForEachBackend([&entry](Backend& backend) { backend.Write(entry); });
};
do {
while (!stop_token.stop_requested()) {
message_queue.PopWait(entry, stop_token);
write_logs();
} while (!stop_token.stop_requested());
if (entry.filename != nullptr)
write_logs();
}
// Drain the logging queue. Only writes out up to MAX_LOGS_TO_WRITE to prevent a
// case where a system is repeatedly spamming logs even on close.
int max_logs_to_write = filter.IsDebug() ? INT_MAX : 100;
@@ -295,11 +315,9 @@ private:
}
void ForEachBackend(auto lambda) {
lambda(static_cast<Backend&>(debugger_backend));
lambda(static_cast<Backend&>(color_console_backend));
lambda(static_cast<Backend&>(file_backend));
#ifdef _WIN32
lambda(static_cast<Backend&>(debugger_backend));
#endif
#ifdef ANDROID
lambda(static_cast<Backend&>(lc_backend));
#endif
@@ -312,11 +330,9 @@ private:
static inline std::unique_ptr<Impl, decltype(&Deleter)> instance{nullptr, Deleter};
Filter filter;
DebuggerBackend debugger_backend{};
ColorConsoleBackend color_console_backend{};
FileBackend file_backend;
#ifdef _WIN32
DebuggerBackend debugger_backend{};
#endif
#ifdef ANDROID
LogcatBackend lc_backend{};
#endif

View File

@@ -47,6 +47,7 @@ SWITCHABLE(AstcRecompression, true);
SWITCHABLE(AudioMode, true);
SWITCHABLE(CpuBackend, true);
SWITCHABLE(CpuAccuracy, true);
SWITCHABLE(FormatReinterpretation, true);
SWITCHABLE(FullscreenMode, true);
SWITCHABLE(GpuAccuracy, true);
SWITCHABLE(Language, true);
@@ -141,10 +142,6 @@ void LogSettings() {
log_path("DataStorage_SDMCDir", Common::FS::GetEdenPath(Common::FS::EdenPath::SDMCDir));
}
bool getDebugKnobAt(u8 i) {
return (values.debug_knobs.GetValue() & (1 << (i & 0xF))) != 0;
}
void UpdateGPUAccuracy() {
values.current_gpu_accuracy = values.gpu_accuracy.GetValue();
}

View File

@@ -69,6 +69,7 @@ SWITCHABLE(AstcRecompression, true);
SWITCHABLE(AudioMode, true);
SWITCHABLE(CpuBackend, true);
SWITCHABLE(CpuAccuracy, true);
SWITCHABLE(FormatReinterpretation, true);
SWITCHABLE(FullscreenMode, true);
SWITCHABLE(GpuAccuracy, true);
SWITCHABLE(Language, true);
@@ -349,7 +350,7 @@ struct Values {
linkage, true, "use_asynchronous_gpu_emulation", Category::Renderer};
SwitchableSetting<AstcDecodeMode, true> accelerate_astc{linkage,
#ifdef ANDROID
AstcDecodeMode::Cpu,
AstcDecodeMode::Gpu,
#else
AstcDecodeMode::Gpu,
#endif
@@ -400,7 +401,7 @@ struct Values {
true,
true};
SwitchableSetting<int, true> fsr_sharpening_slider{linkage,
25,
0,
0,
200,
"fsr_sharpening_slider",
@@ -451,6 +452,19 @@ struct Values {
AstcRecompression::Uncompressed,
"astc_recompression",
Category::RendererAdvanced};
SwitchableSetting<FormatReinterpretation, true> format_reinterpretation{
linkage,
FormatReinterpretation::Disabled,
"format_reinterpretation",
Category::RendererAdvanced};
SwitchableSetting<bool> force_identity_swizzle{linkage,
false,
"force_identity_swizzle",
Category::RendererAdvanced};
SwitchableSetting<bool> force_ldr_to_srgb{linkage,
false,
"force_ldr_to_srgb",
Category::RendererAdvanced};
SwitchableSetting<VramUsageMode, true> vram_usage_mode{linkage,
VramUsageMode::Conservative,
"vram_usage_mode",
@@ -546,7 +560,15 @@ struct Values {
Category::RendererExtensions,
Specialization::Scalar};
SwitchableSetting<bool> vertex_input_dynamic_state{linkage, true, "vertex_input_dynamic_state", Category::RendererExtensions};
SwitchableSetting<bool> vertex_input_dynamic_state{linkage,
#if defined (ANDROID)
false, // Disabled by default on Android (some drivers have issues)
#else
false, // Disabled by default on desktop (some drivers have issues)
#endif
"vertex_input_dynamic_state",
Category::RendererExtensions};
SwitchableSetting<bool> provoking_vertex{linkage, false, "provoking_vertex", Category::RendererExtensions};
SwitchableSetting<bool> descriptor_indexing{linkage, false, "descriptor_indexing", Category::RendererExtensions};
SwitchableSetting<bool> sample_shading{linkage, false, "sample_shading", Category::RendererExtensions, Specialization::Paired};
@@ -561,6 +583,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};
@@ -739,22 +815,11 @@ struct Values {
Setting<bool> perform_vulkan_check{linkage, true, "perform_vulkan_check", Category::Debugging};
Setting<bool> disable_web_applet{linkage, true, "disable_web_applet", Category::Debugging};
SwitchableSetting<u16, true> debug_knobs{linkage,
0,
0,
65535,
"debug_knobs",
Category::Debugging,
Specialization::Countable,
true,
true};
// Miscellaneous
Setting<std::string> serial_battery{linkage, std::string(), "serial_battery", Category::Miscellaneous};
Setting<std::string> serial_unit{linkage, std::string(), "serial_unit", Category::Miscellaneous};
Setting<std::string> log_filter{linkage, "*:Info", "log_filter", Category::Miscellaneous};
Setting<bool> log_flush_line{linkage, false, "flush_line", Category::Miscellaneous, Specialization::Default, true, true};
Setting<bool> censor_username{linkage, true, "censor_username", Category::Miscellaneous};
Setting<bool> use_dev_keys{linkage, false, "use_dev_keys", Category::Miscellaneous};
Setting<bool> first_launch{linkage, true, "first_launch", Category::Miscellaneous};
// Network
@@ -774,14 +839,10 @@ struct Values {
// Per-game overrides
bool use_squashed_iterated_blend;
Setting<bool> enable_overlay{linkage, true, "enable_overlay", Category::Core};
};
extern Values values;
bool getDebugKnobAt(u8 i);
void UpdateGPUAccuracy();
bool IsGPULevelExtreme();
bool IsGPULevelHigh();

View File

@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

View File

@@ -126,7 +126,7 @@ ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt
GmtPlusZero, GmtMinusZero, GmtZero, Greenwich, Hongkong, Hst, Iceland, Iran, Israel, Jamaica,
Japan, Kwajalein, Libya, Met, Mst, Mst7Mdt, Navajo, Nz, NzChat, Poland, Portugal, Prc, Pst8Pdt,
Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu);
ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16, X32, X64, None);
ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16);
ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous);
ENUM(AstcRecompression, Uncompressed, Bc1, Bc3);
ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
@@ -151,6 +151,17 @@ ENUM(AppletMode, HLE, LLE);
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
ENUM(GpuOverclock, Low, Medium, High)
ENUM(TemperatureUnits, Celsius, Fahrenheit)
ENUM(FormatReinterpretation, Disabled, R32UintToR32Sfloat, R32SintToR32Uint, R32SfloatToR32Sint)
// 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) {

View File

@@ -129,7 +129,7 @@ protected:
} else if constexpr (std::is_floating_point_v<Type>) {
return fmt::format("{:f}", value_);
} else if constexpr (std::is_enum_v<Type>) {
return std::to_string(u32(value_));
return std::to_string(static_cast<u32>(value_));
} else {
return std::to_string(value_);
}
@@ -192,13 +192,15 @@ public:
if constexpr (std::is_same_v<Type, std::string>) {
this->SetValue(input);
} else if constexpr (std::is_same_v<Type, std::optional<u32>>) {
this->SetValue(u32(std::stoul(input)));
this->SetValue(static_cast<u32>(std::stoul(input)));
} else if constexpr (std::is_same_v<Type, bool>) {
this->SetValue(input == "true");
} else if constexpr (std::is_same_v<Type, float>) {
this->SetValue(std::stof(input));
} else if constexpr (std::is_same_v<Type, AudioEngine>) {
this->SetValue(ToEnum<AudioEngine>(input));
} else {
this->SetValue(Type(std::stoll(input)));
this->SetValue(static_cast<Type>(std::stoll(input)));
}
} catch (std::invalid_argument&) {
this->SetValue(this->GetDefault());

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -28,21 +25,15 @@ static s64 WindowsQueryPerformanceCounter() {
}
static s64 GetSystemTimeNS() {
static auto pf = (decltype(&GetSystemTimePreciseAsFileTime))(void*)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "GetSystemTimePreciseAsFileTime"); // Windows 8+
if (pf) {
// GetSystemTimePreciseAsFileTime returns the file time in 100ns units.
constexpr s64 Multiplier = 100;
// Convert Windows epoch to Unix epoch.
constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL;
FILETIME filetime;
pf(&filetime);
return Multiplier * ((s64(filetime.dwHighDateTime) << 32) + s64(filetime.dwLowDateTime) - WindowsEpochToUnixEpoch);
} else {
// Only Windows XP and below error out here
LARGE_INTEGER ticks;
QueryPerformanceCounter(&ticks);
return ticks.QuadPart;
}
// GetSystemTimePreciseAsFileTime returns the file time in 100ns units.
static constexpr s64 Multiplier = 100;
// Convert Windows epoch to Unix epoch.
static constexpr s64 WindowsEpochToUnixEpoch = 0x19DB1DED53E8000LL;
FILETIME filetime;
GetSystemTimePreciseAsFileTime(&filetime);
return Multiplier * ((static_cast<s64>(filetime.dwHighDateTime) << 32) +
static_cast<s64>(filetime.dwLowDateTime) - WindowsEpochToUnixEpoch);
}
#endif

View File

@@ -81,9 +81,10 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
// Sets the debugger-visible name of the current thread.
void SetCurrentThreadName(const char* name) {
static auto pf = (decltype(&SetThreadDescription))(void*)GetProcAddress(GetModuleHandle(TEXT("KernelBase.dll")), "SetThreadDescription");
if (pf)
if (auto pf = (decltype(&SetThreadDescription))(void*)GetProcAddress(GetModuleHandle(TEXT("KernelBase.dll")), "SetThreadDescription"); pf)
pf(GetCurrentThread(), UTF8ToUTF16W(name).data()); // Windows 10+
else
; // No-op
}
#else // !MSVC_VER, so must be POSIX threads

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -65,15 +62,14 @@ TimerResolution GetTimerResolution() {
void SetHighQoS() {
// https://learn.microsoft.com/en-us/windows/win32/procthread/quality-of-service
static auto pf = (decltype(&SetProcessInformation))(void*)GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "SetProcessInformation");
if (pf) {
PROCESS_POWER_THROTTLING_STATE PowerThrottling{
.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION,
.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED | PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION,
.StateMask = 0,
};
pf(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling, sizeof(PROCESS_POWER_THROTTLING_STATE)); // Windows 7+
}
PROCESS_POWER_THROTTLING_STATE PowerThrottling{
.Version{PROCESS_POWER_THROTTLING_CURRENT_VERSION},
.ControlMask{PROCESS_POWER_THROTTLING_EXECUTION_SPEED |
PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION},
.StateMask{},
};
SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, &PowerThrottling,
sizeof(PROCESS_POWER_THROTTLING_STATE));
}
} // Anonymous namespace

View File

@@ -487,10 +487,6 @@ add_library(core STATIC
hle/service/am/service/library_applet_self_accessor.h
hle/service/am/service/lock_accessor.cpp
hle/service/am/service/lock_accessor.h
hle/service/am/service/overlay_functions.cpp
hle/service/am/service/overlay_functions.h
hle/service/am/service/overlay_applet_proxy.cpp
hle/service/am/service/overlay_applet_proxy.h
hle/service/am/service/process_winding_controller.cpp
hle/service/am/service/process_winding_controller.h
hle/service/am/service/self_controller.cpp
@@ -1203,7 +1199,7 @@ else()
target_link_libraries(core PUBLIC Boost::headers)
endif()
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API MbedTLS::mbedcrypto${MBEDTLS_LIB_SUFFIX} MbedTLS::mbedtls${MBEDTLS_LIB_SUFFIX})
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API MbedTLS::mbedcrypto${YUZU_STATIC_SUFFIX} MbedTLS::mbedtls${YUZU_STATIC_SUFFIX})
# if (MINGW)
# target_link_libraries(core PRIVATE ws2_32 mswsock wlanapi)
# endif()

View File

@@ -211,7 +211,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ArmDynarmic32::MakeJit(Common::PageTable* pa
config.enable_cycle_counting = !m_uses_wall_clock;
// Code cache size
#if defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
#if defined(ARCHITECTURE_arm64) || defined(__sun__)
config.code_cache_size = std::uint32_t(128_MiB);
#else
config.code_cache_size = std::uint32_t(512_MiB);
@@ -295,7 +295,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ArmDynarmic32::MakeJit(Common::PageTable* pa
// Curated optimizations
case Settings::CpuAccuracy::Auto:
config.unsafe_optimizations = true;
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__NetBSD__)
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__DragonFly__)
config.fastmem_pointer = std::nullopt;
config.fastmem_exclusive_access = false;
#endif

View File

@@ -270,7 +270,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ArmDynarmic64::MakeJit(Common::PageTable* pa
config.enable_cycle_counting = !m_uses_wall_clock;
// Code cache size
#if defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
#if defined(ARCHITECTURE_arm64) || defined(__sun__)
config.code_cache_size = std::uint32_t(128_MiB);
#else
config.code_cache_size = std::uint32_t(512_MiB);

View File

@@ -580,21 +580,6 @@ struct System::Impl {
gpu_dirty_memory_managers;
std::deque<std::vector<u8>> user_channel;
std::mutex general_channel_mutex;
std::deque<std::vector<u8>> general_channel;
std::unique_ptr<Service::KernelHelpers::ServiceContext> general_channel_context; // lazy
std::unique_ptr<Service::Event> general_channel_event; // lazy
bool general_channel_initialized{false};
void EnsureGeneralChannelInitialized(System& system) {
if (general_channel_initialized) {
return;
}
general_channel_context = std::make_unique<Service::KernelHelpers::ServiceContext>(system, "GeneralChannel");
general_channel_event = std::make_unique<Service::Event>(*general_channel_context);
general_channel_initialized = true;
}
};
System::System() : impl{std::make_unique<Impl>(*this)} {}
@@ -1008,39 +993,6 @@ std::deque<std::vector<u8>>& System::GetUserChannel() {
return impl->user_channel;
}
std::deque<std::vector<u8>>& System::GetGeneralChannel() {
return impl->general_channel;
}
void System::PushGeneralChannelData(std::vector<u8>&& data) {
std::scoped_lock lk{impl->general_channel_mutex};
impl->EnsureGeneralChannelInitialized(*this);
const bool was_empty = impl->general_channel.empty();
impl->general_channel.push_back(std::move(data));
if (was_empty) {
impl->general_channel_event->Signal();
}
}
bool System::TryPopGeneralChannel(std::vector<u8>& out_data) {
std::scoped_lock lk{impl->general_channel_mutex};
if (!impl->general_channel_initialized || impl->general_channel.empty()) {
return false;
}
out_data = std::move(impl->general_channel.back());
impl->general_channel.pop_back();
if (impl->general_channel.empty()) {
impl->general_channel_event->Clear();
}
return true;
}
Service::Event& System::GetGeneralChannelEvent() {
std::scoped_lock lk{impl->general_channel_mutex};
impl->EnsureGeneralChannelInitialized(*this);
return *impl->general_channel_event;
}
void System::RegisterExitCallback(ExitCallback&& callback) {
impl->exit_callback = std::move(callback);
}

View File

@@ -17,8 +17,6 @@
#include "common/common_types.h"
#include "core/file_sys/vfs/vfs_types.h"
#include "core/hle/service/os/event.h"
#include "core/hle/service/kernel_helpers.h"
namespace Core::Frontend {
class EmuWindow;
@@ -430,11 +428,6 @@ public:
*/
[[nodiscard]] std::deque<std::vector<u8>>& GetUserChannel();
[[nodiscard]] std::deque<std::vector<u8>>& GetGeneralChannel();
void PushGeneralChannelData(std::vector<u8>&& data);
bool TryPopGeneralChannel(std::vector<u8>& out_data);
[[nodiscard]] Service::Event& GetGeneralChannelEvent();
/// Type used for the frontend to designate a callback for System to exit the application.
using ExitCallback = std::function<void()>;

View File

@@ -640,20 +640,32 @@ KeyManager::KeyManager() {
void KeyManager::ReloadKeys() {
// Initialize keys
const auto keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
if (!Common::FS::CreateDir(keys_dir))
const auto yuzu_keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
if (!Common::FS::CreateDir(yuzu_keys_dir)) {
LOG_ERROR(Core, "Failed to create the keys directory.");
LoadFromFile(keys_dir / "prod.keys_autogenerated", false);
LoadFromFile(keys_dir / "prod.keys", false);
LoadFromFile(keys_dir / "title.keys_autogenerated", true);
LoadFromFile(keys_dir / "title.keys", true);
LoadFromFile(keys_dir / "console.keys_autogenerated", false);
LoadFromFile(keys_dir / "console.keys", false);
}
if (Settings::values.use_dev_keys) {
dev_mode = true;
LoadFromFile(yuzu_keys_dir / "dev.keys_autogenerated", false);
LoadFromFile(yuzu_keys_dir / "dev.keys", false);
} else {
dev_mode = false;
LoadFromFile(yuzu_keys_dir / "prod.keys_autogenerated", false);
LoadFromFile(yuzu_keys_dir / "prod.keys", false);
}
LoadFromFile(yuzu_keys_dir / "title.keys_autogenerated", true);
LoadFromFile(yuzu_keys_dir / "title.keys", true);
LoadFromFile(yuzu_keys_dir / "console.keys_autogenerated", false);
LoadFromFile(yuzu_keys_dir / "console.keys", false);
}
static bool ValidCryptoRevisionString(std::string_view base, size_t begin, size_t length) {
if (base.size() < begin + length)
if (base.size() < begin + length) {
return false;
}
return std::all_of(base.begin() + begin, base.begin() + begin + length,
[](u8 c) { return std::isxdigit(c); });
}
@@ -838,8 +850,9 @@ void KeyManager::WriteKeyToFile(KeyCategory category, std::string_view keyname,
const auto yuzu_keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
std::string filename = "title.keys_autogenerated";
if (category == KeyCategory::Standard) {
filename = "prod.keys_autogenerated";
filename = dev_mode ? "dev.keys_autogenerated" : "prod.keys_autogenerated";
} else if (category == KeyCategory::Console) {
filename = "console.keys_autogenerated";
}
@@ -934,10 +947,17 @@ void KeyManager::SetKey(S256KeyType id, Key256 key, u64 field1, u64 field2) {
}
bool KeyManager::KeyFileExists(bool title) {
const auto keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
if (title)
return Common::FS::Exists(keys_dir / "title.keys");
return Common::FS::Exists(keys_dir / "prod.keys");
const auto yuzu_keys_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::KeysDir);
if (title) {
return Common::FS::Exists(yuzu_keys_dir / "title.keys");
}
if (Settings::values.use_dev_keys) {
return Common::FS::Exists(yuzu_keys_dir / "dev.keys");
}
return Common::FS::Exists(yuzu_keys_dir / "prod.keys");
}
void KeyManager::DeriveSDSeedLazy() {

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -314,6 +311,7 @@ private:
std::array<u8, 576> eticket_extended_kek{};
RSAKeyPair<2048> eticket_rsa_keypair{};
bool dev_mode;
void LoadFromFile(const std::filesystem::path& file_path, bool is_title_keys);
template <size_t Size>

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,7 +5,6 @@
#include <array>
#include <string>
#include <vector>
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/swap.h"

View File

@@ -95,7 +95,7 @@ std::string SaveDataFactory::GetSaveDataSpaceIdPath(SaveDataSpaceId space) {
case SaveDataSpaceId::System:
return "/system/";
case SaveDataSpaceId::User:
case SaveDataSpaceId::SdUser:
case SaveDataSpaceId::SdUser:
return "/user/";
case SaveDataSpaceId::Temporary:
return "/temp/";

View File

@@ -16,7 +16,7 @@ namespace HLE::ApiVersion {
constexpr u8 HOS_VERSION_MAJOR = 21;
constexpr u8 HOS_VERSION_MINOR = 0;
constexpr u8 HOS_VERSION_MICRO = 1;
constexpr u8 HOS_VERSION_MICRO = 0;
// NintendoSDK version constants.
@@ -24,9 +24,9 @@ constexpr u8 SDK_REVISION_MAJOR = 1;
constexpr u8 SDK_REVISION_MINOR = 0;
constexpr char PLATFORM_STRING[] = "NX";
constexpr char VERSION_HASH[] = "066a75e6fab7316de34b88b60d229a0b2729e421";
constexpr char DISPLAY_VERSION[] = "21.0.1";
constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 21.0.1-1.0";
constexpr char VERSION_HASH[] = "f6b2425b6888a66590db104fc734891696e0ecb3";
constexpr char DISPLAY_VERSION[] = "21.0.0";
constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 21.0.0-1.0";
// Atmosphere version constants.

View File

@@ -215,7 +215,7 @@ public:
{220, nullptr, "SynchronizeProfileAsync"},
{221, nullptr, "UploadProfileAsync"},
{222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"},
{250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"},
{250, nullptr, "IsLinkedWithNintendoAccount"},
{251, nullptr, "CreateProcedureToLinkWithNintendoAccount"},
{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
@@ -236,13 +236,6 @@ public:
RegisterHandlers(functions);
}
private:
void IsLinkedWithNintendoAccount(HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(false);
}
};
class IAuthorizationRequest final : public ServiceFramework<IAuthorizationRequest> {
@@ -503,35 +496,6 @@ protected:
rb.Push(static_cast<u32>(buffer.size()));
}
void LoadIdTokenCache(HLERequestContext& ctx) {
LOG_WARNING(Service_ACC, "(STUBBED) called");
std::vector<u8> token_data(0x100);
std::fill(token_data.begin(), token_data.end(), u8(0));
(void)ctx.WriteBuffer(token_data);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(static_cast<u32>(token_data.size()));
}
void GetNintendoAccountUserResourceCacheForApplication(HLERequestContext& ctx) {
LOG_WARNING(Service_ACC, "(STUBBED) called");
std::vector<u8> nas_user_base_for_application(0x68);
(void)ctx.WriteBuffer(nas_user_base_for_application);
if (ctx.CanWriteBuffer(1)) {
std::vector<u8> unknown_out_buffer(ctx.GetWriteBufferSize(1));
(void)ctx.WriteBuffer(unknown_out_buffer, 1);
}
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
rb.PushRaw<u64>(profile_manager.GetLastOpenedUser().Hash());
}
void Store(HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto base = rp.PopRaw<ProfileBase>();
@@ -743,7 +707,7 @@ private:
std::vector<u8> token_data(0x100);
std::fill(token_data.begin(), token_data.end(), u8(0));
ctx.WriteBuffer(token_data);
ctx.WriteBuffer(token_data, 0);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
@@ -754,7 +718,7 @@ private:
LOG_WARNING(Service_ACC, "(STUBBED) called");
std::vector<u8> nas_user_base_for_application(0x68);
ctx.WriteBuffer(nas_user_base_for_application);
ctx.WriteBuffer(nas_user_base_for_application, 0);
if (ctx.CanWriteBuffer(1)) {
std::vector<u8> unknown_out_buffer(ctx.GetWriteBufferSize(1));
@@ -970,7 +934,6 @@ Result Module::Interface::InitializeApplicationInfoBase() {
application_info.application_type = ApplicationType::GameCard;
break;
case FileSys::StorageId::Host:
case FileSys::StorageId::NandSystem:
case FileSys::StorageId::NandUser:
case FileSys::StorageId::SdCard:
case FileSys::StorageId::None: // Yuzu specific, differs from hardware
@@ -1091,17 +1054,6 @@ void Module::Interface::GetProfileEditor(HLERequestContext& ctx) {
rb.PushIpcInterface<IProfileEditor>(system, user_id, *profile_manager);
}
void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) {
IPC::RequestParser rp{ctx};
const auto uuid = rp.PopRaw<Common::UUID>();
LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess);
rb.PushIpcInterface<IAdministrator>(system, uuid);
}
void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) {
LOG_DEBUG(Service_ACC, "called");

View File

@@ -42,7 +42,6 @@ public:
void DeleteUser(HLERequestContext& ctx);
void SetUserPosition(HLERequestContext& ctx);
void GetProfileEditor(HLERequestContext& ctx);
void GetBaasAccountAdministrator(HLERequestContext &ctx);
void ListQualifiedUsers(HLERequestContext& ctx);
void ListOpenContextStoredUsers(HLERequestContext& ctx);
void StoreSaveDataThumbnailApplication(HLERequestContext& ctx);

View File

@@ -55,7 +55,7 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
{230, nullptr, "AuthenticateServiceAsync"},
{250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"},
{250, nullptr, "GetBaasAccountAdministrator"},
{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
{299, nullptr, "SuspendBackgroundDaemon"},
@@ -80,4 +80,4 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
ACC_SU::~ACC_SU() = default;
} // namespace Service::Account
} // namespace Service::Account

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -18,7 +15,6 @@ class FrontendApplet;
enum class AppletType {
Application,
LibraryApplet,
OverlayApplet,
SystemApplet,
};
@@ -150,7 +146,6 @@ enum class AppletMessage : u32 {
ForceHideApplicationLogo = 57,
FloatingApplicationDetected = 60,
DetectShortPressingCaptureButton = 90,
DetectLongPressingCaptureButton = 91,
AlbumScreenShotTaken = 92,
AlbumRecordingSaved = 93,
};

View File

@@ -12,7 +12,7 @@ namespace Service::AM {
Applet::Applet(Core::System& system, std::unique_ptr<Process> process_, bool is_application)
: context(system, "Applet"), lifecycle_manager(system, context, is_application),
process(std::move(process_)), hid_registration(system, *process), overlay_event(context),
process(std::move(process_)), hid_registration(system, *process),
gpu_error_detected_event(context), friend_invitation_storage_channel_event(context),
notification_storage_channel_event(context), health_warning_disappeared_system_event(context),
unknown_event(context), acquired_sleep_lock_event(context), pop_from_general_channel_event(context),
@@ -63,15 +63,7 @@ void Applet::SetInteractibleLocked(bool interactible) {
is_interactible = interactible;
const bool exit_requested = lifecycle_manager.GetExitRequested();
const bool input_enabled = interactible && !exit_requested;
if (applet_id == AppletId::OverlayDisplay || applet_id == AppletId::Application) {
LOG_DEBUG(Service_AM, "called, applet={} interactible={} exit_requested={} input_enabled={} overlay_in_foreground={}",
static_cast<u32>(applet_id), interactible, exit_requested, input_enabled, overlay_in_foreground);
}
hid_registration.EnableAppletToGetInput(input_enabled);
hid_registration.EnableAppletToGetInput(interactible && !lifecycle_manager.GetExitRequested());
}
void Applet::OnProcessTerminatedLocked() {

View File

@@ -122,10 +122,8 @@ struct Applet {
bool is_activity_runnable{};
bool is_interactible{true};
bool window_visible{true};
bool overlay_in_foreground{false};
// Events
Event overlay_event;
Event gpu_error_detected_event;
Event friend_invitation_storage_channel_event;
Event notification_storage_channel_event;

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -18,7 +15,6 @@
#include "core/hle/service/am/service/storage.h"
#include "core/hle/service/am/window_system.h"
#include "hid_core/hid_types.h"
#include "core/hle/service/am/process_creation.h"
namespace Service::AM {
@@ -266,22 +262,6 @@ void AppletManager::SetWindowSystem(WindowSystem* window_system) {
m_cv.wait(lk, [&] { return m_pending_process != nullptr; });
if (Settings::values.enable_overlay) {
if (auto overlay_process = CreateProcess(m_system, static_cast<u64>(AppletProgramId::OverlayDisplay), 0, 0)) {
auto overlay_applet = std::make_shared<Applet>(m_system, std::move(overlay_process), false);
overlay_applet->program_id = static_cast<u64>(AppletProgramId::OverlayDisplay);
overlay_applet->applet_id = AppletId::OverlayDisplay;
overlay_applet->type = AppletType::OverlayApplet;
overlay_applet->library_applet_mode = LibraryAppletMode::PartialForeground;
overlay_applet->window_visible = true;
overlay_applet->home_button_short_pressed_blocked = false;
overlay_applet->home_button_long_pressed_blocked = false;
m_window_system->TrackApplet(overlay_applet, false);
overlay_applet->process->Run();
LOG_INFO(Service_AM, "called, Overlay applet launched before application (initially hidden, watching home button)");
}
}
const auto& params = m_pending_parameters;
auto applet = std::make_shared<Applet>(m_system, std::move(m_pending_process),
params.applet_id == AppletId::Application);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -49,7 +46,6 @@ public:
public:
void SetWindowSystem(WindowSystem* window_system);
[[nodiscard]] WindowSystem* GetWindowSystem() const { return m_window_system; }
private:
Core::System& m_system;

View File

@@ -1,11 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/core.h"
#include "core/hle/service/am/am_types.h"
#include "core/hle/service/am/button_poller.h"
#include "core/hle/service/am/window_system.h"
#include "hid_core/frontend/emulated_controller.h"
@@ -23,9 +19,9 @@ ButtonPressDuration ClassifyPressDuration(std::chrono::steady_clock::time_point
// TODO: determine actual thresholds
// TODO: these are likely different for each button
if (dur < 400ms) {
if (dur < 500ms) {
return ButtonPressDuration::ShortPressing;
} else if (dur < 800ms) {
} else if (dur < 1000ms) {
return ButtonPressDuration::MiddlePressing;
} else {
return ButtonPressDuration::LongPressing;
@@ -51,22 +47,14 @@ ButtonPoller::ButtonPoller(Core::System& system, WindowSystem& window_system)
m_handheld_key = m_handheld->SetCallback(engine_callback);
m_player1 = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
m_player1_key = m_player1->SetCallback(engine_callback);
m_thread = std::thread([this] { this->ThreadLoop(); });
}
ButtonPoller::~ButtonPoller() {
m_handheld->DeleteCallback(m_handheld_key);
m_player1->DeleteCallback(m_player1_key);
m_stop = true;
m_cv.notify_all();
if (m_thread.joinable()) {
m_thread.join();
}
}
void ButtonPoller::OnButtonStateChanged() {
std::lock_guard lk{m_mutex};
const bool home_button =
m_handheld->GetHomeButtons().home.Value() || m_player1->GetHomeButtons().home.Value();
const bool capture_button = m_handheld->GetCaptureButtons().capture.Value() ||
@@ -75,54 +63,22 @@ void ButtonPoller::OnButtonStateChanged() {
// Buttons pressed which were not previously pressed
if (home_button && !m_home_button_press_start) {
m_home_button_press_start = std::chrono::steady_clock::now();
m_home_button_long_sent = false;
}
if (capture_button && !m_capture_button_press_start) {
m_capture_button_press_start = std::chrono::steady_clock::now();
m_capture_button_long_sent = false;
}
// if (power_button && !m_power_button_press_start) {
// m_power_button_press_start = std::chrono::steady_clock::now();
// }
// While buttons are held, check whether they have crossed the long-press
// threshold and, if so, send the long-press action immediately (only once).
if (home_button && m_home_button_press_start && !m_home_button_long_sent) {
const auto duration = ClassifyPressDuration(*m_home_button_press_start);
if (duration != ButtonPressDuration::ShortPressing) {
m_window_system.OnSystemButtonPress(SystemButtonType::HomeButtonLongPressing);
m_home_button_long_sent = true;
}
}
if (capture_button && m_capture_button_press_start && !m_capture_button_long_sent) {
const auto duration = ClassifyPressDuration(*m_capture_button_press_start);
if (duration != ButtonPressDuration::ShortPressing) {
m_window_system.OnSystemButtonPress(SystemButtonType::CaptureButtonLongPressing);
m_capture_button_long_sent = true;
}
}
// Buttons released which were previously held
if (!home_button && m_home_button_press_start) {
if(!m_home_button_long_sent) {
const auto duration = ClassifyPressDuration(*m_home_button_press_start);
m_window_system.OnSystemButtonPress(
duration == ButtonPressDuration::ShortPressing ? SystemButtonType::HomeButtonShortPressing
: SystemButtonType::HomeButtonLongPressing);
}
m_window_system.OnHomeButtonPressed(ClassifyPressDuration(*m_home_button_press_start));
m_home_button_press_start = std::nullopt;
m_home_button_long_sent = false;
}
if (!capture_button && m_capture_button_press_start) {
if (!m_capture_button_long_sent) {
const auto duration = ClassifyPressDuration(*m_capture_button_press_start);
m_window_system.OnSystemButtonPress(
duration == ButtonPressDuration::ShortPressing ? SystemButtonType::CaptureButtonShortPressing
: SystemButtonType::CaptureButtonLongPressing);
}
// TODO
m_capture_button_press_start = std::nullopt;
m_capture_button_long_sent = false;
}
// if (!power_button && m_power_button_press_start) {
// // TODO
@@ -130,16 +86,4 @@ void ButtonPoller::OnButtonStateChanged() {
// }
}
void ButtonPoller::ThreadLoop() {
using namespace std::chrono_literals;
std::unique_lock lk{m_mutex};
while (!m_stop) {
m_cv.wait_for(lk, 50ms);
if (m_stop) break;
lk.unlock();
OnButtonStateChanged();
lk.lock();
}
}
} // namespace Service::AM

View File

@@ -1,17 +1,10 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <optional>
#include <thread>
#include "hid_core/frontend/emulated_controller.h"
namespace Core {
@@ -33,7 +26,6 @@ public:
private:
void OnButtonStateChanged();
void ThreadLoop();
private:
WindowSystem& m_window_system;
@@ -46,15 +38,6 @@ private:
std::optional<std::chrono::steady_clock::time_point> m_home_button_press_start{};
std::optional<std::chrono::steady_clock::time_point> m_capture_button_press_start{};
std::optional<std::chrono::steady_clock::time_point> m_power_button_press_start{};
bool m_home_button_long_sent{};
bool m_capture_button_long_sent{};
bool m_power_button_long_sent{};
std::thread m_thread;
std::atomic<bool> m_stop{false};
std::condition_variable m_cv;
std::mutex m_mutex;
};
} // namespace Service::AM

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -36,10 +33,6 @@ void DisplayLayerManager::Initialize(Core::System& system, Kernel::KProcess* pro
m_buffer_sharing_enabled = false;
m_blending_enabled = mode == LibraryAppletMode::PartialForeground ||
mode == LibraryAppletMode::PartialForegroundIndirectDisplay;
if (m_applet_id != AppletId::Application) {
(void)this->IsSystemBufferSharingEnabled();
}
}
void DisplayLayerManager::Finalize() {
@@ -76,18 +69,6 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) {
out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()}));
m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id);
if (m_applet_id != AppletId::Application) {
(void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id);
if (m_applet_id == AppletId::OverlayDisplay) {
static constexpr s32 kOverlayBackgroundZ = -1;
(void)m_manager_display_service->SetLayerZIndex(kOverlayBackgroundZ, *out_layer_id);
} else {
static constexpr s32 kOverlayZ = 3;
(void)m_manager_display_service->SetLayerZIndex(kOverlayZ, *out_layer_id);
}
}
m_managed_display_layers.emplace(*out_layer_id);
R_SUCCEED();
@@ -124,15 +105,7 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() {
// We succeeded, so set up remaining state.
m_buffer_sharing_enabled = true;
// Ensure the overlay layer is visible
m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id);
m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id);
s32 initial_z = 1;
if (m_applet_id == AppletId::OverlayDisplay) {
initial_z = -1;
}
m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id);
R_SUCCEED();
}
@@ -155,14 +128,10 @@ void DisplayLayerManager::SetWindowVisibility(bool visible) {
if (m_manager_display_service) {
if (m_system_shared_layer_id) {
LOG_INFO(Service_VI, "shared_layer={} visible={} applet_id={}",
m_system_shared_layer_id, m_visible, static_cast<u32>(m_applet_id));
m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id);
}
for (const auto layer_id : m_managed_display_layers) {
LOG_INFO(Service_VI, "managed_layer={} visible={} applet_id={}",
layer_id, m_visible, static_cast<u32>(m_applet_id));
m_manager_display_service->SetLayerVisibility(m_visible, layer_id);
}
}
@@ -172,22 +141,6 @@ bool DisplayLayerManager::GetWindowVisibility() const {
return m_visible;
}
void DisplayLayerManager::SetOverlayZIndex(s32 z_index) {
if (!m_manager_display_service) {
return;
}
if (m_system_shared_layer_id) {
m_manager_display_service->SetLayerZIndex(z_index, m_system_shared_layer_id);
LOG_INFO(Service_VI, "called, shared_layer={} z={}", m_system_shared_layer_id, z_index);
}
for (const auto layer_id : m_managed_display_layers) {
m_manager_display_service->SetLayerZIndex(z_index, layer_id);
LOG_INFO(Service_VI, "called, managed_layer={} z={}", layer_id, z_index);
}
}
Result DisplayLayerManager::WriteAppletCaptureBuffer(bool* out_was_written,
s32* out_fbshare_layer_index) {
R_UNLESS(m_buffer_sharing_enabled, VI::ResultPermissionDenied);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -46,8 +43,6 @@ public:
void SetWindowVisibility(bool visible);
bool GetWindowVisibility() const;
void SetOverlayZIndex(s32 z_index);
Result WriteAppletCaptureBuffer(bool* out_was_written, s32* out_fbshare_layer_index);
private:

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -10,7 +7,6 @@
#include "core/hle/service/am/service/application_proxy.h"
#include "core/hle/service/am/service/library_applet_proxy.h"
#include "core/hle/service/am/service/system_applet_proxy.h"
#include "core/hle/service/am/service/overlay_applet_proxy.h"
#include "core/hle/service/am/window_system.h"
#include "core/hle/service/cmif_serialization.h"
@@ -25,7 +21,7 @@ IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& sys
{110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"},
{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"},
{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"},
{300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"},
{300, nullptr, "OpenOverlayAppletProxy"},
{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
{410, nullptr, "GetSystemAppletControllerForDebug"},
@@ -71,22 +67,6 @@ Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy(
}
}
Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy(
Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy, ClientProcessId pid,
InCopyHandle<Kernel::KProcess> process_handle,
InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) {
LOG_WARNING(Service_AM, "called");
if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
*out_overlay_applet_proxy = std::make_shared<IOverlayAppletProxy>(
system, applet, process_handle.Get(), m_window_system);
R_SUCCEED();
} else {
UNIMPLEMENTED();
R_THROW(ResultUnknown);
}
}
Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy(
Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
InCopyHandle<Kernel::KProcess> process_handle,

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,7 +5,6 @@
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h"
#include "core/hle/service/am/service/overlay_applet_proxy.h"
namespace Service {
@@ -35,9 +31,6 @@ private:
ClientProcessId pid,
InCopyHandle<Kernel::KProcess> process_handle,
InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute);
Result OpenOverlayAppletProxy(Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy,
ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle,
InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute);
Result OpenLibraryAppletProxyOld(
Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
InCopyHandle<Kernel::KProcess> process_handle);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -21,7 +18,7 @@ IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_,
{20, nullptr, "PushToAppletBoundChannel"},
{21, nullptr, "TryPopFromAppletBoundChannel"},
{40, nullptr, "GetDisplayLogicalResolution"},
{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
{42, nullptr, "SetDisplayMagnification"},
{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
{52, nullptr, "IsHomeButtonShortPressedBlocked"},
@@ -61,14 +58,6 @@ Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled(
R_SUCCEED();
}
Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width,
height);
std::scoped_lock lk{applet->lock};
applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
R_SUCCEED();
}
Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) {
LOG_WARNING(Service_AM, "(STUBBED) called");
std::scoped_lock lk{applet->lock};

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -21,7 +18,6 @@ public:
private:
Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled);
Result GetHomeButtonDoubleClickEnabled(Out<bool> out_home_button_double_click_enabled);
Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height);
Result SetCpuBoostRequestPriority(s32 priority);
Result GetCurrentApplicationId(Out<u64> out_application_id);
Result Unknown350(Out<u16> out_unknown);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -59,7 +56,7 @@ IApplicationCreator::IApplicationCreator(Core::System& system_, WindowSystem& wi
static const FunctionInfo functions[] = {
{0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"},
{1, nullptr, "PopLaunchRequestedApplication"},
{10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"},
{10, nullptr, "CreateSystemApplication"},
{100, nullptr, "PopFloatingApplicationForDevelopment"},
};
// clang-format on
@@ -76,34 +73,4 @@ Result IApplicationCreator::CreateApplication(
CreateGuestApplication(out_application_accessor, system, m_window_system, application_id));
}
Result IApplicationCreator::CreateSystemApplication(
Out<SharedPointer<IApplicationAccessor>> out_application_accessor, u64 application_id) {
FileSys::VirtualFile nca_raw{};
auto& storage = system.GetContentProviderUnion();
nca_raw = storage.GetEntryRaw(application_id, FileSys::ContentRecordType::Program);
R_UNLESS(nca_raw != nullptr, ResultUnknown);
std::vector<u8> control;
std::unique_ptr<Loader::AppLoader> loader;
auto process =
CreateProcess(system, application_id, 1, 21);
R_UNLESS(process != nullptr, ResultUnknown);
const auto applet = std::make_shared<Applet>(system, std::move(process), true);
applet->program_id = application_id;
applet->applet_id = AppletId::Starter;
applet->type = AppletType::LibraryApplet;
applet->library_applet_mode = LibraryAppletMode::AllForeground;
m_window_system.TrackApplet(applet, true);
*out_application_accessor =
std::make_shared<IApplicationAccessor>(system, applet, m_window_system);
R_SUCCEED();
}
} // namespace Service::AM

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -22,7 +19,6 @@ public:
private:
Result CreateApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
Result CreateSystemApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
WindowSystem& m_window_system;
};

View File

@@ -9,11 +9,11 @@
#include "core/hle/service/am/applet.h"
#include "core/hle/service/am/service/common_state_getter.h"
#include "core/hle/service/am/service/lock_accessor.h"
#include "core/hle/service/am/service/storage.h"
#include "core/hle/service/apm/apm_interface.h"
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/pm/pm.h"
#include "core/hle/service/sm/sm.h"
#include "core/hle/service/vi/vi.h"
#include "core/hle/service/vi/vi_types.h"
namespace Service::AM {
@@ -37,7 +37,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Ap
{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
{14, nullptr, "GetWakeupCount"},
{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
{20, nullptr, "PushToGeneralChannel"},
{30, nullptr, "GetHomeButtonReaderLockAccessor"},
{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"},
{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"},
@@ -61,7 +61,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Ap
{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"},
{90, nullptr, "SetPerformanceConfigurationChangedNotification"},
{91, nullptr, "GetCurrentPerformanceConfiguration"},
{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
{100, nullptr, "SetHandlingHomeButtonShortPressedEnabled"},
{110, nullptr, "OpenMyGpuErrorHandler"},
{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"},
{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
@@ -95,9 +95,6 @@ Result ICommonStateGetter::ReceiveMessage(Out<AppletMessage> out_applet_message)
R_THROW(AM::ResultNoMessages);
}
LOG_DEBUG(Service_AM, "called, returning message={} to applet_id={}",
static_cast<u32>(*out_applet_message), static_cast<u32>(m_applet->applet_id));
R_SUCCEED();
}
@@ -265,40 +262,7 @@ Result ICommonStateGetter::GetBuiltInDisplayType(Out<s32> out_display_type) {
}
Result ICommonStateGetter::PerformSystemButtonPressingIfInFocus(SystemButtonType type) {
LOG_DEBUG(Service_AM, "called, type={}", type);
std::scoped_lock lk{m_applet->lock};
switch (type) {
case SystemButtonType::HomeButtonShortPressing:
if (!m_applet->home_button_short_pressed_blocked) {
m_applet->lifecycle_manager.PushUnorderedMessage(
AppletMessage::DetectShortPressingHomeButton);
}
break;
case SystemButtonType::HomeButtonLongPressing:
if (!m_applet->home_button_long_pressed_blocked) {
m_applet->lifecycle_manager.PushUnorderedMessage(
AppletMessage::DetectLongPressingHomeButton);
}
break;
case SystemButtonType::CaptureButtonShortPressing:
if (m_applet->handling_capture_button_short_pressed_message_enabled_for_applet) {
m_applet->lifecycle_manager.PushUnorderedMessage(
AppletMessage::DetectShortPressingCaptureButton);
}
break;
case SystemButtonType::CaptureButtonLongPressing:
if (m_applet->handling_capture_button_long_pressed_message_enabled_for_applet) {
m_applet->lifecycle_manager.PushUnorderedMessage(
AppletMessage::DetectLongPressingCaptureButton);
}
break;
default:
// Other buttons ignored for now
break;
}
LOG_WARNING(Service_AM, "(STUBBED) called, type={}", type);
R_SUCCEED();
}
@@ -340,18 +304,4 @@ Result ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnab
R_SUCCEED();
}
Result ICommonStateGetter::PushToGeneralChannel(SharedPointer<IStorage> storage) {
LOG_DEBUG(Service_AM, "called");
system.PushGeneralChannelData(storage->GetData());
R_SUCCEED();
}
Result ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled(bool enabled) {
LOG_DEBUG(Service_AM, "called, enabled={} applet_id={}", enabled, m_applet->applet_id);
std::scoped_lock lk{m_applet->lock};
m_applet->home_button_short_pressed_blocked = !enabled;
R_SUCCEED();
}
} // namespace Service::AM

View File

@@ -21,7 +21,6 @@ namespace Service::AM {
struct Applet;
class ILockAccessor;
class IStorage;
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
public:
@@ -61,8 +60,6 @@ private:
OutArray<AppletId, BufferAttr_HipcMapAlias> out_applet_ids);
Result GetSettingsPlatformRegion(Out<Set::PlatformRegion> out_settings_platform_region);
Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled();
Result PushToGeneralChannel(SharedPointer<IStorage> storage); // cmd 20
Result SetHandlingHomeButtonShortPressedEnabled(bool enabled);
void SetCpuBoostMode(HLERequestContext& ctx);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,21 +6,20 @@
#include "core/hle/service/am/service/home_menu_functions.h"
#include "core/hle/service/am/window_system.h"
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/am/am_results.h"
#include "core/hle/service/am/service/storage.h"
namespace Service::AM {
IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IHomeMenuFunctions"}, m_window_system{window_system},
m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"} {
m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"},
m_pop_from_general_channel_event{m_context} {
// clang-format off
static const FunctionInfo functions[] = {
{10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"},
{11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"},
{12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"},
{20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"},
{20, nullptr, "PopFromGeneralChannel"},
{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
{30, nullptr, "GetHomeButtonWriterLockAccessor"},
{31, nullptr, "GetWriterLockAccessorEx"},
@@ -61,22 +57,10 @@ Result IHomeMenuFunctions::UnlockForeground() {
R_SUCCEED();
}
Result IHomeMenuFunctions::PopFromGeneralChannel(Out<SharedPointer<IStorage>> out_storage) {
LOG_DEBUG(Service_AM, "called");
std::vector<u8> data;
if (!system.TryPopGeneralChannel(data)) {
R_THROW(AM::ResultNoDataInChannel);
}
*out_storage = std::make_shared<IStorage>(system, std::move(data));
R_SUCCEED();
}
Result IHomeMenuFunctions::GetPopFromGeneralChannelEvent(
OutCopyHandle<Kernel::KReadableEvent> out_event) {
LOG_INFO(Service_AM, "called");
*out_event = system.GetGeneralChannelEvent().GetHandle();
*out_event = m_pop_from_general_channel_event.GetHandle();
R_SUCCEED();
}

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,7 +12,6 @@ namespace Service::AM {
struct Applet;
class WindowSystem;
class IStorage;
class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> {
public:
@@ -27,7 +23,6 @@ private:
Result RequestToGetForeground();
Result LockForeground();
Result UnlockForeground();
Result PopFromGeneralChannel(Out<SharedPointer<IStorage>> out_storage);
Result GetPopFromGeneralChannelEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result IsRebootEnabled(Out<bool> out_is_reboot_enbaled);
Result IsForceTerminateApplicationDisabledForDebug(
@@ -36,6 +31,7 @@ private:
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
KernelHelpers::ServiceContext m_context;
Event m_pop_from_general_channel_event;
};
} // namespace Service::AM

View File

@@ -1,120 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "core/hle/service/am/service/common_state_getter.h"
#include "core/hle/service/am/service/display_controller.h"
#include "core/hle/service/am/service/global_state_controller.h"
#include "core/hle/service/am/service/audio_controller.h"
#include "core/hle/service/am/service/applet_common_functions.h"
#include "core/hle/service/am/service/overlay_applet_proxy.h"
#include "core/hle/service/am/service/library_applet_creator.h"
#include "core/hle/service/am/service/process_winding_controller.h"
#include "core/hle/service/am/service/self_controller.h"
#include "core/hle/service/am/service/window_controller.h"
#include "core/hle/service/am/service/debug_functions.h"
#include "core/hle/service/cmif_serialization.h"
namespace Service::AM {
IOverlayAppletProxy::IOverlayAppletProxy(Core::System &system_, std::shared_ptr<Applet> applet,
Kernel::KProcess *process, WindowSystem &window_system)
: ServiceFramework{system_, "IOverlayAppletProxy"},
m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
// clang-format off
static const FunctionInfo functions[] = {
{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"},
{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"},
{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"},
{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"},
{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"},
{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
};
// clang-format on
RegisterHandlers(functions);
}
IOverlayAppletProxy::~IOverlayAppletProxy() = default;
Result IOverlayAppletProxy::GetCommonStateGetter(
Out<SharedPointer<ICommonStateGetter> > out_common_state_getter) {
LOG_DEBUG(Service_AM, "called");
*out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetSelfController(
Out<SharedPointer<ISelfController> > out_self_controller) {
LOG_DEBUG(Service_AM, "called");
*out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetWindowController(
Out<SharedPointer<IWindowController> > out_window_controller) {
LOG_DEBUG(Service_AM, "called");
*out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetAudioController(
Out<SharedPointer<IAudioController> > out_audio_controller) {
LOG_DEBUG(Service_AM, "called");
*out_audio_controller = std::make_shared<IAudioController>(system);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetDisplayController(
Out<SharedPointer<IDisplayController> > out_display_controller) {
LOG_DEBUG(Service_AM, "called");
*out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetProcessWindingController(
Out<SharedPointer<IProcessWindingController> > out_process_winding_controller) {
LOG_DEBUG(Service_AM, "called");
*out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetLibraryAppletCreator(
Out<SharedPointer<ILibraryAppletCreator> > out_library_applet_creator) {
LOG_DEBUG(Service_AM, "called");
*out_library_applet_creator =
std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetOverlayFunctions(
Out<SharedPointer<IOverlayFunctions> > out_overlay_functions) {
LOG_DEBUG(Service_AM, "called");
*out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetAppletCommonFunctions(
Out<SharedPointer<IAppletCommonFunctions> > out_applet_common_functions) {
LOG_DEBUG(Service_AM, "called");
*out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetGlobalStateController(
Out<SharedPointer<IGlobalStateController> > out_global_state_controller) {
LOG_DEBUG(Service_AM, "called");
*out_global_state_controller = std::make_shared<IGlobalStateController>(system);
R_SUCCEED();
}
Result IOverlayAppletProxy::GetDebugFunctions(
Out<SharedPointer<IDebugFunctions> > out_debug_functions) {
LOG_DEBUG(Service_AM, "called");
*out_debug_functions = std::make_shared<IDebugFunctions>(system);
R_SUCCEED();
}
} // namespace Service::AM

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