diff --git a/ARMeilleure/Translation/AOT/Aot.cs b/ARMeilleure/Translation/AOT/Aot.cs index c201bda154..bd32da64b8 100644 --- a/ARMeilleure/Translation/AOT/Aot.cs +++ b/ARMeilleure/Translation/AOT/Aot.cs @@ -13,7 +13,10 @@ namespace ARMeilleure.Translation.AOT { public static class Aot { - private const string WorkDir = "RyuAot"; + private const string BaseDir = "Ryujinx"; + + private const string TitleIdTextDefault = "0000000000000000"; + private const string DisplayVersionDefault = "0"; private const int SaveInterval = 30; // Seconds. @@ -29,28 +32,28 @@ namespace ARMeilleure.Translation.AOT private static readonly Timer _timer; + private static readonly string _basePath; + private static readonly object _locker; private static bool _disposed; - public static string WorkPath { get; } - public static string TitleId { get; private set; } + public static string WorkPath { get; private set; } + public static string TitleIdText { get; private set; } + public static string DisplayVersion { get; private set; } public static bool Enabled { get; private set; } public static bool ReadOnlyMode { get; private set; } static Aot() { - string basePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - WorkPath = Path.Combine(basePath, WorkDir); + _basePath = Path.Combine(appDataPath, BaseDir); - if (!Directory.Exists(WorkPath)) - { - Directory.CreateDirectory(WorkPath); - } - - TitleId = String.Empty; + WorkPath = String.Empty; + TitleIdText = TitleIdTextDefault; + DisplayVersion = DisplayVersionDefault; Enabled = false; ReadOnlyMode = true; @@ -69,11 +72,25 @@ namespace ARMeilleure.Translation.AOT _disposed = false; } - public static void Init(string titleId, bool enabled = true, bool readOnlyMode = false) + public static void Init(string titleIdText, string displayVersion, bool enabled = true, bool readOnlyMode = false) { - if (!String.IsNullOrEmpty(titleId)) + if (String.IsNullOrEmpty(titleIdText) || titleIdText == TitleIdTextDefault) { - TitleId = titleId.ToUpper(); + return; + } + + TitleIdText = titleIdText; + + if (!String.IsNullOrEmpty(displayVersion)) + { + DisplayVersion = displayVersion; + } + + WorkPath = Path.Combine(_basePath, "games", TitleIdText, "cpu", "cache"); + + if (!Directory.Exists(WorkPath)) + { + Directory.CreateDirectory(WorkPath); } Enabled = enabled; @@ -92,7 +109,7 @@ namespace ARMeilleure.Translation.AOT private static void LoadAndSplit() { - string cachePath = Path.Combine(WorkPath, TitleId); + string cachePath = Path.Combine(WorkPath, DisplayVersion); FileInfo cacheInfo = new FileInfo(cachePath); @@ -254,7 +271,7 @@ namespace ARMeilleure.Translation.AOT cacheStream.Seek(0L, SeekOrigin.Begin); cacheStream.Write(hash, 0, hashSize); - string cachePath = Path.Combine(WorkPath, TitleId); + string cachePath = Path.Combine(WorkPath, DisplayVersion); using (FileStream compressedCacheStream = new FileStream(cachePath, FileMode.OpenOrCreate)) { diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index 843c586ef8..50ddd58cc6 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -113,6 +113,7 @@ namespace Ryujinx.HLE.HOS public BlitStruct ControlData { get; set; } public string TitleName { get; private set; } + public string DisplayVersion { get; private set; } public ulong TitleId { get; private set; } public string TitleIdText => TitleId.ToString("x16"); @@ -298,7 +299,7 @@ namespace Ryujinx.HLE.HOS } } - private (Nca Main, Nca patch, Nca Control) GetXciGameData(Xci xci) + private (Nca main, Nca patch, Nca control) GetXciGameData(Xci xci) { if (!xci.HasPartition(XciPartitionType.Secure)) { @@ -389,6 +390,8 @@ namespace Ryujinx.HLE.HOS TitleName = ControlData.Value.Titles.ToArray() .FirstOrDefault(x => x.Name[0] != 0).Name.ToString(); } + + DisplayVersion = ControlData.Value.DisplayVersion.ToString(); } } else @@ -517,10 +520,6 @@ namespace Ryujinx.HLE.HOS Device.FileSystem.SetRomFs(dataStorage.AsStream(FileAccess.Read)); } - LoadExeFs(codeFs, out Npdm metaData); - - TitleId = metaData.Aci0.TitleId; - if (controlNca != null) { ReadControlData(controlNca); @@ -530,6 +529,8 @@ namespace Ryujinx.HLE.HOS ControlData.ByteSpan.Clear(); } + LoadExeFs(codeFs, out _); + if (TitleId != 0) { EnsureSaveData(new TitleId(TitleId)); @@ -583,7 +584,7 @@ namespace Ryujinx.HLE.HOS Logger.PrintInfo(LogClass.Loader, "AOT Init..."); - Aot.Init(TitleId); + Aot.Init(TitleIdText, DisplayVersion); ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray()); }