aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2023-03-31 21:16:46 +0200
committerGitHub <noreply@github.com>2023-03-31 21:16:46 +0200
commit4c2d9ff3ff9d7afb1fd0bd764bee5931fa5f053c (patch)
tree1245f5ec356551bd20a9594d114d06a53c41d036 /Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
parent8198b99935f562ffb2fb9a75175a8df24d235152 (diff)
HLE: Refactoring of ApplicationLoader (#4480)1.1.689
* HLE: Refactoring of ApplicationLoader * Fix SDL2 Headless * Addresses gdkchan feedback * Fixes LoadUnpackedNca RomFS loading * remove useless casting * Cleanup and fixe empty application name * Remove ProcessInfo * Fixes typo * ActiveProcess to ActiveApplication * Update check * Clean using. * Use the correct filepath when loading Homebrew.npdm * Fix NRE in ProcessResult if MetaLoader is null * Add more checks for valid processId & return success * Add missing logging statement for npdm error * Return result for LoadKip() * Move error logging out of PFS load extension method This avoids logging "Could not find Main NCA" followed by "Loading main..." when trying to start hbl. * Fix GUIs not checking load results * Fix style and formatting issues * Fix formatting and wording * gtk: Refactor LoadApplication() --------- Co-authored-by: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.HLE/Loaders/Processes/ProcessResult.cs')
-rw-r--r--Ryujinx.HLE/Loaders/Processes/ProcessResult.cs92
1 files changed, 92 insertions, 0 deletions
diff --git a/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
new file mode 100644
index 00000000..6bbeee1b
--- /dev/null
+++ b/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
@@ -0,0 +1,92 @@
+using LibHac.Loader;
+using LibHac.Ns;
+using Ryujinx.Common.Logging;
+using Ryujinx.Cpu;
+using Ryujinx.HLE.Loaders.Processes.Extensions;
+using Ryujinx.Horizon.Common;
+
+namespace Ryujinx.HLE.Loaders.Processes
+{
+ public struct ProcessResult
+ {
+ public static ProcessResult Failed => new(null, new ApplicationControlProperty(), false, false, null, 0, 0, 0);
+
+ private readonly byte _mainThreadPriority;
+ private readonly uint _mainThreadStackSize;
+
+ public readonly IDiskCacheLoadState DiskCacheLoadState;
+
+ public readonly MetaLoader MetaLoader;
+ public readonly ApplicationControlProperty ApplicationControlProperties;
+
+ public readonly ulong ProcessId;
+ public string Name;
+ public ulong ProgramId;
+ public readonly string ProgramIdText;
+ public readonly bool Is64Bit;
+ public readonly bool DiskCacheEnabled;
+ public readonly bool AllowCodeMemoryForJit;
+
+ public ProcessResult(
+ MetaLoader metaLoader,
+ ApplicationControlProperty applicationControlProperties,
+ bool diskCacheEnabled,
+ bool allowCodeMemoryForJit,
+ IDiskCacheLoadState diskCacheLoadState,
+ ulong pid,
+ byte mainThreadPriority,
+ uint mainThreadStackSize)
+ {
+ _mainThreadPriority = mainThreadPriority;
+ _mainThreadStackSize = mainThreadStackSize;
+
+ DiskCacheLoadState = diskCacheLoadState;
+ ProcessId = pid;
+
+ MetaLoader = metaLoader;
+ ApplicationControlProperties = applicationControlProperties;
+
+ if (metaLoader is not null)
+ {
+ ulong programId = metaLoader.GetProgramId();
+
+ Name = metaLoader.GetProgramName();
+ ProgramId = programId;
+ ProgramIdText = $"{programId:x16}";
+ Is64Bit = metaLoader.IsProgram64Bit();
+ }
+
+ DiskCacheEnabled = diskCacheEnabled;
+ AllowCodeMemoryForJit = allowCodeMemoryForJit;
+ }
+
+ public bool Start(Switch device)
+ {
+ device.Configuration.ContentManager.LoadEntries(device);
+
+ Result result = device.System.KernelContext.Processes[ProcessId].Start(_mainThreadPriority, _mainThreadStackSize);
+ if (result != Result.Success)
+ {
+ Logger.Error?.Print(LogClass.Loader, $"Process start returned error \"{result}\".");
+
+ return false;
+ }
+
+ // TODO: LibHac npdm currently doesn't support version field.
+ string version;
+
+ if (ProgramId > 0x0100000000007FFF)
+ {
+ version = ApplicationControlProperties.DisplayVersionString.ToString();
+ }
+ else
+ {
+ version = device.System.ContentManager.GetCurrentFirmwareVersion().VersionString;
+ }
+
+ Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {Name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]");
+
+ return true;
+ }
+ }
+} \ No newline at end of file