forked from Mirror/Ryujinx
4c2d9ff3ff
* 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>
92 lines
No EOL
3.3 KiB
C#
92 lines
No EOL
3.3 KiB
C#
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;
|
|
}
|
|
}
|
|
} |