diff --git a/assets/locales.json b/assets/locales.json index 327c3994e..3a5b45f5f 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -6445,26 +6445,27 @@ { "ID": "SettingsButtonResetConfirm", "Translations": { - "ar_SA": "أريد إعادة تعيين إعداداتي", - "de_DE": "Ich möchte meine Einstellungen zurücksetzen", - "el_GR": "Θέλω να επαναφέρω τις ρυθμίσεις μου", - "en_US": "I Want To Reset My Settings", - "es_ES": "Quiero Restablecer Mi Configuración", - "fr_FR": "Je Veux Réinitialiser Mes Paramètres", - "he_IL": "אני רוצה לאפס את ההגדרות שלי", - "it_IT": "Voglio reimpostare le mie impostazioni", - "ja_JP": "設定をリセットしたいです", - "ko_KR": "설정을 초기화하고 싶습니다", - "no_NO": "Jeg vil tilbakestille innstillingene mine", - "pl_PL": "Chcę zresetować moje ustawienia", - "pt_BR": "Quero redefinir minhas configurações", - "ru_RU": "Я хочу сбросить свои настройки", - "sv_SE": "Jag vill nollställa mina inställningar", - "th_TH": "ฉันต้องการรีเซ็ตการตั้งค่าของฉัน", - "tr_TR": "Ayarlarımı sıfırlamak istiyorum", - "uk_UA": "Я хочу скинути налаштування", - "zh_CN": "我要重置我的设置", - "zh_TW": "我想重設我的設定" + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "I want to reset my settings.", + "es_ES": "Quiero restablecer mi Configuración.", + "fr_FR": "Je veux réinitialiser mes paramètres.", + "he_IL": "", + "it_IT": "Voglio ripristinare le mie impostazioni.", + "ja_JP": "", + "ko_KR": "설정을 초기화하고 싶습니다.", + "no_NO": "Jeg vil tilbakestille innstillingene mine.", + "pl_PL": "", + "pt_BR": "Quero redefinir minhas configurações.", + "ru_RU": "Я хочу сбросить свои настройки.", + "sv_SE": "Jag vill nollställa mina inställningar.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Я хочу скинути налаштування.", + "zh_CN": "我要重置我的设置。", + "zh_TW": "我想重設我的設定。" + } }, { diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs index e05fc8397..e3c5865ae 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs @@ -29,6 +29,7 @@ namespace Ryujinx.HLE.HOS.Kernel capabilities, context.ResourceLimit, MemoryRegion.Service, + context.Device.Configuration.MemoryConfiguration, null, customThreadStart); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index ee1b4a7be..bc59b0b4d 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -102,6 +102,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ProcessCreationFlags flags, bool fromBack, MemoryRegion memRegion, + MemoryConfiguration memConfig, ulong address, ulong size, KMemoryBlockSlabManager slabManager) @@ -117,6 +118,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory addrSpaceBase, addrSpaceSize, memRegion, + memConfig, address, size, slabManager); @@ -159,6 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong addrSpaceStart, ulong addrSpaceEnd, MemoryRegion memRegion, + MemoryConfiguration memConfig, ulong address, ulong size, KMemoryBlockSlabManager slabManager) @@ -193,7 +196,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory case ProcessCreationFlags.AddressSpace64BitDeprecated: aliasRegion.Size = 0x180000000; - heapRegion.Size = 0x180000000; + heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u; stackRegion.Size = 0; tlsIoRegion.Size = 0; CodeRegionStart = 0x8000000; @@ -223,7 +226,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize); aliasRegion.Size = 1UL << (addressSpaceWidth - 3); - heapRegion.Size = 0x180000000; + heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u; stackRegion.Size = 1UL << (addressSpaceWidth - 8); tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3); CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment); @@ -237,7 +240,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory else { aliasRegion.Size = 0x1000000000; - heapRegion.Size = 0x180000000; + heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u; stackRegion.Size = 0x80000000; tlsIoRegion.Size = 0x1000000000; CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index bea1f0ef3..b823d14f7 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -124,6 +124,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KPageList pageList, KResourceLimit resourceLimit, MemoryRegion memRegion, + MemoryConfiguration memConfig, IProcessContextFactory contextFactory, ThreadStart customThreadStart = null) { @@ -153,6 +154,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process creationInfo.Flags, !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr), memRegion, + memConfig, codeAddress, codeSize, slabManager); @@ -189,6 +191,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ReadOnlySpan capabilities, KResourceLimit resourceLimit, MemoryRegion memRegion, + MemoryConfiguration memConfig, IProcessContextFactory contextFactory, ThreadStart customThreadStart = null) { @@ -252,6 +255,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process creationInfo.Flags, !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr), memRegion, + memConfig, codeAddress, codeSize, slabManager); diff --git a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 005ac1452..260ff8af3 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -137,6 +137,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall capabilities, resourceLimit, memRegion, + _context.Device.Configuration.MemoryConfiguration, contextFactory, customThreadStart); @@ -888,7 +889,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall [Svc(1)] public Result SetHeapSize([PointerSized] out ulong address, [PointerSized] ulong size) { - if ((size & 0xfffffffe001fffff) != 0) + if ((size & 0xfffffffd001fffff) != 0) { address = 0; diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs index 5729052e8..7f0c6b3f5 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs @@ -189,7 +189,7 @@ namespace Ryujinx.HLE.Loaders.Processes codeAddress, codeSize); - result = process.InitializeKip(creationInfo, kip.Capabilities, pageList, context.ResourceLimit, memoryRegion, processContextFactory); + result = process.InitializeKip(creationInfo, kip.Capabilities, pageList, context.ResourceLimit, memoryRegion, context.Device.Configuration.MemoryConfiguration, processContextFactory); if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -389,6 +389,7 @@ namespace Ryujinx.HLE.Loaders.Processes MemoryMarshal.Cast(npdm.KernelCapabilityData), resourceLimit, memoryRegion, + context.Device.Configuration.MemoryConfiguration, processContextFactory); if (result != Result.Success) diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs index 5656d6e73..c10ec69bd 100644 --- a/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs @@ -11,11 +11,13 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Systems.PlayReport; using Ryujinx.Ava.Utilities; +using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; using System; using System.IO; +using System.Linq; using System.Text.Json.Serialization; namespace Ryujinx.Ava.Systems.AppLibrary @@ -84,6 +86,32 @@ namespace Ryujinx.Ava.Systems.AppLibrary public LocaleKeys? PlayabilityStatus => Compatibility.Convert(x => x.Status).OrElse(null); + public bool HasPtcCacheFiles + { + get + { + DirectoryInfo mainDir = new(System.IO.Path.Combine(AppDataManager.GamesDirPath, IdString, "cache", "cpu", "0")); + DirectoryInfo backupDir = new(System.IO.Path.Combine(AppDataManager.GamesDirPath, IdString, "cache", "cpu", "1")); + + return (mainDir.Exists && (mainDir.EnumerateFiles("*.cache").Any() || mainDir.EnumerateFiles("*.info").Any())) || + (backupDir.Exists && (backupDir.EnumerateFiles("*.cache").Any() || backupDir.EnumerateFiles("*.info").Any())); + } + } + + public bool HasShaderCacheFiles + { + get + { + DirectoryInfo shaderCacheDir = new(System.IO.Path.Combine(AppDataManager.GamesDirPath, IdString, "cache", "shader")); + + if (!shaderCacheDir.Exists) return false; + + return shaderCacheDir.EnumerateDirectories("*").Any() || + shaderCacheDir.GetFiles("*.toc").Length != 0 || + shaderCacheDir.GetFiles("*.data").Length != 0; + } + } + public string LocalizedStatusTooltip => Compatibility.Convert(x => #pragma warning disable CS8509 // It is exhaustive for all possible values this can contain. diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml index 909154540..9f2999a4c 100755 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml @@ -120,13 +120,13 @@ CommandParameter="{Binding}" Header="{ext:Locale GameListContextMenuCacheManagementNukePptc}" Icon="{ext:Icon fa-solid fa-trash-can}" - IsEnabled="{Binding HasPtcCacheFiles}" /> + IsEnabled="{Binding SelectedApplication.HasPtcCacheFiles, FallbackValue=False}" /> + IsEnabled="{Binding SelectedApplication.HasShaderCacheFiles, FallbackValue=False}" /> ReadLocalJsonFileAsync() + { + bool isValid = false; + AmiiboJson amiiboJson = new(); + + try + { + try + { + if (File.Exists(_amiiboJsonPath)) + { + isValid = TryGetAmiiboJson(await File.ReadAllTextAsync(_amiiboJsonPath), out amiiboJson); + } + } + catch (Exception exception) + { + Logger.Warning?.Print(LogClass.Application, $"Unable to read data from '{_amiiboJsonPath}': {exception}"); + isValid = false; + } + + if (!isValid) + { + return null; + } + } + catch (Exception exception) + { + if (!isValid) + { + Logger.Error?.Print(LogClass.Application, $"Couldn't get valid amiibo data: {exception}"); + + // Neither local file is not valid JSON, close window. + await ShowInfoDialog(); + Close(); + } + } + + return amiiboJson; + } + private async Task LoadContentAsync() { - AmiiboJson amiiboJson = await GetMostRecentAmiiboListOrDefaultJson(); + AmiiboJson? amiiboJson; - _amiiboList = amiiboJson.Amiibo.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); + if (CommandLineState.OnlyLocalAmiibo) + amiiboJson = await ReadLocalJsonFileAsync(); + else + amiiboJson = await GetMostRecentAmiiboListOrDefaultJson(); + + if (!amiiboJson.HasValue) + return; + + _amiiboList = amiiboJson.Value.Amiibo.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); ParseAmiiboData(); } diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 241ff576d..c11051348 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -2121,8 +2121,7 @@ namespace Ryujinx.Ava.UI.ViewModels }); public static AsyncRelayCommand NukePtcCache { get; } = - Commands.CreateConditional(vm => vm?.SelectedApplication != null && - vm.HasPtcCacheFiles(), + Commands.CreateConditional(vm => vm?.SelectedApplication?.HasPtcCacheFiles ?? false, async viewModel => { UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( @@ -2171,22 +2170,9 @@ namespace Ryujinx.Ava.UI.ViewModels } }); - private bool HasPtcCacheFiles() - { - if (this.SelectedApplication == null) return false; - - DirectoryInfo mainDir = new DirectoryInfo(Path.Combine(AppDataManager.GamesDirPath, - this.SelectedApplication.IdString, "cache", "cpu", "0")); - DirectoryInfo backupDir = new DirectoryInfo(Path.Combine(AppDataManager.GamesDirPath, - this.SelectedApplication.IdString, "cache", "cpu", "1")); - - return (mainDir.Exists && (mainDir.EnumerateFiles("*.cache").Any() || mainDir.EnumerateFiles("*.info").Any())) || - (backupDir.Exists && (backupDir.EnumerateFiles("*.cache").Any() || backupDir.EnumerateFiles("*.info").Any())); - } - public static AsyncRelayCommand PurgeShaderCache { get; } = Commands.CreateConditional( - vm => vm?.SelectedApplication != null && vm.HasShaderCacheFiles(), + vm => vm?.SelectedApplication?.HasShaderCacheFiles ?? false, async viewModel => { UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( @@ -2243,20 +2229,6 @@ namespace Ryujinx.Ava.UI.ViewModels } }); - private bool HasShaderCacheFiles() - { - if (this.SelectedApplication == null) return false; - - DirectoryInfo shaderCacheDir = new(Path.Combine(AppDataManager.GamesDirPath, - this.SelectedApplication.IdString, "cache", "shader")); - - if (!shaderCacheDir.Exists) return false; - - return shaderCacheDir.EnumerateDirectories("*").Any() || - shaderCacheDir.GetFiles("*.toc").Any() || - shaderCacheDir.GetFiles("*.data").Any(); - } - public static RelayCommand OpenPtcDirectory { get; } = Commands.CreateConditional(vm => vm?.SelectedApplication != null, viewModel => diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml index 39db76031..b572d04e6 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml +++ b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml @@ -35,7 +35,7 @@ @@ -49,11 +46,9 @@ Padding="10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" - ClipToBounds="True"> + ClipToBounds="True" + CornerRadius="5"> - - = args.Length)