mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-04-21 18:13:14 +02:00
Compare commits
5 commits
db20055ece
...
d464a859a7
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d464a859a7 | ||
![]() |
e7d3f39c1b | ||
![]() |
2f064064ca | ||
![]() |
1ece186254 | ||
![]() |
1e7e4322b4 |
18 changed files with 200 additions and 107 deletions
|
@ -265,13 +265,25 @@ namespace Ryujinx.HLE.HOS
|
|||
HorizonFsClient fsClient = new(this);
|
||||
|
||||
ServiceTable = new ServiceTable();
|
||||
IEnumerable<ServiceEntry> services = ServiceTable.GetServices(new HorizonOptions
|
||||
(Device.Configuration.IgnoreMissingServices,
|
||||
|
||||
IEnumerable<ServiceEntry> services = ServiceTable.GetServices(new HorizonOptions(
|
||||
#if DEBUG
|
||||
Device.Configuration.IgnoreMissingServices,
|
||||
LibHacHorizonManager.BcatClient,
|
||||
fsClient,
|
||||
AccountManager,
|
||||
Device.AudioDeviceDriver,
|
||||
TickSource));
|
||||
TickSource
|
||||
#else
|
||||
LibHacHorizonManager.BcatClient,
|
||||
fsClient,
|
||||
AccountManager,
|
||||
Device.AudioDeviceDriver,
|
||||
TickSource
|
||||
#endif
|
||||
));
|
||||
|
||||
|
||||
|
||||
foreach (ServiceEntry service in services)
|
||||
{
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
using Gommon;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.Exceptions;
|
||||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
@ -21,22 +23,43 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
private int _selfId;
|
||||
private bool _isDomain;
|
||||
|
||||
public IpcService(ServerBase server = null)
|
||||
public IpcService(ServerBase server = null, bool registerTipc = false)
|
||||
{
|
||||
CmifCommands = GetType().Assembly.GetTypes()
|
||||
.Where(type => type == GetType())
|
||||
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
|
||||
Stopwatch sw = Stopwatch.StartNew();
|
||||
|
||||
CmifCommands = GetType()
|
||||
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandCmifAttribute>()
|
||||
.Select(command => (command.Id, methodInfo)))
|
||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
||||
|
||||
sw.Stop();
|
||||
|
||||
Logger.Debug?.Print(
|
||||
LogClass.Emulation,
|
||||
$"{CmifCommands.Count} Cmif commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).",
|
||||
GetType().AsPrettyString()
|
||||
);
|
||||
|
||||
TipcCommands = GetType().Assembly.GetTypes()
|
||||
.Where(type => type == GetType())
|
||||
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandTipcAttribute>()
|
||||
.Select(command => (command.Id, methodInfo)))
|
||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
||||
if (registerTipc)
|
||||
{
|
||||
sw.Start();
|
||||
|
||||
TipcCommands = GetType()
|
||||
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandTipcAttribute>()
|
||||
.Select(command => (command.Id, methodInfo)))
|
||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
||||
|
||||
sw.Stop();
|
||||
|
||||
Logger.Debug?.Print(
|
||||
LogClass.Emulation,
|
||||
$"{TipcCommands.Count} Tipc commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).",
|
||||
GetType().AsPrettyString()
|
||||
);
|
||||
}
|
||||
|
||||
Server = server;
|
||||
|
||||
_parent = this;
|
||||
|
@ -112,7 +135,8 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
int commandId = (int)context.RequestData.ReadInt64();
|
||||
|
||||
bool serviceExists = service.CmifCommands.TryGetValue(commandId, out MethodInfo processRequest);
|
||||
|
||||
|
||||
#if DEBUG
|
||||
if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
|
||||
{
|
||||
ResultCode result = ResultCode.Success;
|
||||
|
@ -158,6 +182,39 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
|
||||
throw new ServiceNotImplementedException(service, context, dbgMessage);
|
||||
}
|
||||
#else
|
||||
if (serviceExists)
|
||||
{
|
||||
context.ResponseData.BaseStream.Seek(_isDomain ? 0x20 : 0x10, SeekOrigin.Begin);
|
||||
|
||||
Logger.Trace?.Print(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Name}");
|
||||
|
||||
ResultCode result = (ResultCode)processRequest.Invoke(service, [context]);
|
||||
|
||||
if (_isDomain)
|
||||
{
|
||||
foreach (int id in context.Response.ObjectIds)
|
||||
{
|
||||
context.ResponseData.Write(id);
|
||||
}
|
||||
|
||||
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
context.ResponseData.Write(context.Response.ObjectIds.Count);
|
||||
}
|
||||
|
||||
context.ResponseData.BaseStream.Seek(_isDomain ? 0x10 : 0, SeekOrigin.Begin);
|
||||
|
||||
context.ResponseData.Write(IpcMagic.Sfco);
|
||||
context.ResponseData.Write((long)result);
|
||||
}
|
||||
else
|
||||
{
|
||||
string dbgMessage = $"{service.GetType().FullName}: {commandId}";
|
||||
|
||||
throw new ServiceNotImplementedException(service, context, dbgMessage);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public void CallTipcMethod(ServiceCtx context)
|
||||
|
@ -166,6 +223,7 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
|
||||
bool serviceExists = TipcCommands.TryGetValue(commandId, out MethodInfo processRequest);
|
||||
|
||||
#if DEBUG
|
||||
if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
|
||||
{
|
||||
ResultCode result = ResultCode.Success;
|
||||
|
@ -198,6 +256,26 @@ namespace Ryujinx.HLE.HOS.Services
|
|||
|
||||
throw new ServiceNotImplementedException(this, context, dbgMessage);
|
||||
}
|
||||
#else
|
||||
if (serviceExists)
|
||||
{
|
||||
context.ResponseData.BaseStream.Seek(0x4, SeekOrigin.Begin);
|
||||
|
||||
Logger.Debug?.Print(LogClass.KernelIpc, $"{GetType().Name}: {processRequest.Name}");
|
||||
|
||||
ResultCode result = (ResultCode)processRequest.Invoke(this, [context]);
|
||||
|
||||
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
context.ResponseData.Write((uint)result);
|
||||
}
|
||||
else
|
||||
{
|
||||
string dbgMessage = $"{GetType().FullName}: {commandId}";
|
||||
|
||||
throw new ServiceNotImplementedException(this, context, dbgMessage);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
protected void MakeObject(ServiceCtx context, IpcService obj)
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm
|
|||
|
||||
private bool _isInitialized;
|
||||
|
||||
public IUserInterface(KernelContext context, SmRegistry registry)
|
||||
public IUserInterface(KernelContext context, SmRegistry registry) : base(registerTipc: true)
|
||||
{
|
||||
_commonServer = new ServerBase(context, "CommonServer");
|
||||
_registry = registry;
|
||||
|
@ -102,11 +102,13 @@ namespace Ryujinx.HLE.HOS.Services.Sm
|
|||
}
|
||||
else
|
||||
{
|
||||
#if DEBUG
|
||||
if (context.Device.Configuration.IgnoreMissingServices)
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Service, $"Missing service {name} ignored");
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
throw new NotImplementedException(name);
|
||||
}
|
||||
|
|
|
@ -137,12 +137,14 @@ namespace Ryujinx.HLE
|
|||
/// </summary>
|
||||
public MemoryManagerMode MemoryManagerMode { internal get; set; }
|
||||
|
||||
#if DEBUG
|
||||
/// <summary>
|
||||
/// Control the initial state of the ignore missing services setting.
|
||||
/// If this is set to true, when a missing service is encountered, it will try to automatically handle it instead of throwing an exception.
|
||||
/// </summary>
|
||||
/// TODO: Update this again.
|
||||
public bool IgnoreMissingServices { internal get; set; }
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Aspect Ratio applied to the renderer window by the SurfaceFlinger service.
|
||||
|
@ -207,7 +209,9 @@ namespace Ryujinx.HLE
|
|||
long systemTimeOffset,
|
||||
string timeZone,
|
||||
MemoryManagerMode memoryManagerMode,
|
||||
#if DEBUG
|
||||
bool ignoreMissingServices,
|
||||
#endif
|
||||
AspectRatio aspectRatio,
|
||||
float audioVolume,
|
||||
bool useHypervisor,
|
||||
|
@ -232,7 +236,9 @@ namespace Ryujinx.HLE
|
|||
SystemTimeOffset = systemTimeOffset;
|
||||
TimeZone = timeZone;
|
||||
MemoryManagerMode = memoryManagerMode;
|
||||
#if DEBUG
|
||||
IgnoreMissingServices = ignoreMissingServices;
|
||||
#endif
|
||||
AspectRatio = aspectRatio;
|
||||
AudioVolume = audioVolume;
|
||||
UseHypervisor = useHypervisor;
|
||||
|
|
|
@ -4,6 +4,7 @@ using Ryujinx.Audio.Backends.CompatLayer;
|
|||
using Ryujinx.Audio.Integration;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Graphics.Gpu;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.HLE.HOS;
|
||||
|
@ -83,6 +84,11 @@ namespace Ryujinx.HLE
|
|||
|
||||
UpdateVSyncInterval();
|
||||
#pragma warning restore IDE0055
|
||||
|
||||
#if DEBUG
|
||||
if (Configuration.IgnoreMissingServices)
|
||||
Logger.Notice.Print(LogClass.Emulation, "Ignore Missing Services is enabled.", nameof(Switch));
|
||||
#endif
|
||||
|
||||
Shared = this;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,9 @@ namespace Ryujinx.Horizon
|
|||
{
|
||||
public readonly struct HorizonOptions
|
||||
{
|
||||
#if DEBUG
|
||||
public bool IgnoreMissingServices { get; }
|
||||
#endif
|
||||
public bool ThrowOnInvalidCommandIds { get; }
|
||||
|
||||
public HorizonClient BcatClient { get; }
|
||||
|
@ -18,14 +20,18 @@ namespace Ryujinx.Horizon
|
|||
public ITickSource TickSource { get; }
|
||||
|
||||
public HorizonOptions(
|
||||
#if DEBUG
|
||||
bool ignoreMissingServices,
|
||||
#endif
|
||||
HorizonClient bcatClient,
|
||||
IFsClient fsClient,
|
||||
IEmulatorAccountManager accountManager,
|
||||
IHardwareDeviceDriver audioDeviceDriver,
|
||||
ITickSource tickSource)
|
||||
{
|
||||
#if DEBUG
|
||||
IgnoreMissingServices = ignoreMissingServices;
|
||||
#endif
|
||||
ThrowOnInvalidCommandIds = true;
|
||||
BcatClient = bcatClient;
|
||||
FsClient = fsClient;
|
||||
|
|
|
@ -39,6 +39,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
|
|||
|
||||
if (!entries.TryGetValue((int)commandId, out CommandHandler commandHandler))
|
||||
{
|
||||
#if DEBUG
|
||||
if (HorizonStatic.Options.IgnoreMissingServices)
|
||||
{
|
||||
// If ignore missing services is enabled, just pretend that everything is fine.
|
||||
|
@ -49,8 +50,10 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
|
|||
Logger.Warning?.Print(LogClass.Service, $"Missing service {objectName} (command ID: {commandId}) ignored");
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
else if (HorizonStatic.Options.ThrowOnInvalidCommandIds)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (HorizonStatic.Options.ThrowOnInvalidCommandIds)
|
||||
{
|
||||
throw new NotImplementedException($"{objectName} command ID: {commandId} is not implemented");
|
||||
}
|
||||
|
|
|
@ -5247,31 +5247,6 @@
|
|||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "SettingsTabSystemIgnoreMissingServices",
|
||||
"Translations": {
|
||||
"ar_SA": "تجاهل الخدمات المفقودة",
|
||||
"de_DE": "Ignoriere fehlende Dienste",
|
||||
"el_GR": "Αγνόηση υπηρεσιών που λείπουν",
|
||||
"en_US": "Ignore Missing Services",
|
||||
"es_ES": "Ignorar servicios no implementados",
|
||||
"fr_FR": "Ignorer les services manquants",
|
||||
"he_IL": "התעלם משירותים חסרים",
|
||||
"it_IT": "Ignora servizi mancanti",
|
||||
"ja_JP": "未実装サービスを無視する",
|
||||
"ko_KR": "누락된 서비스 무시",
|
||||
"no_NO": "Ignorer manglende tjenester",
|
||||
"pl_PL": "Ignoruj Brakujące Usługi",
|
||||
"pt_BR": "Ignorar Serviços Ausentes",
|
||||
"ru_RU": "Игнорировать отсутствующие службы",
|
||||
"sv_SE": "Ignorera saknade tjänster",
|
||||
"th_TH": "เมินเฉยบริการที่หายไป",
|
||||
"tr_TR": "Eksik Servisleri Görmezden Gel",
|
||||
"uk_UA": "Ігнорувати відсутні служби",
|
||||
"zh_CN": "忽略缺失的服务",
|
||||
"zh_TW": "忽略缺少的模擬器功能"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "SettingsTabSystemIgnoreControllerApplet",
|
||||
"Translations": {
|
||||
|
@ -16647,31 +16622,6 @@
|
|||
"zh_TW": "利用另一種 MemoryMode 配置來模仿 Switch 開發模式。\n\n這僅對高解析度紋理套件或 4K 解析度模組有用。不會提高效能。\n\n如果不確定,請設定為 4GiB。"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "IgnoreMissingServicesTooltip",
|
||||
"Translations": {
|
||||
"ar_SA": "يتجاهل خدمات نظام هوريزون غير المنفذة. قد يساعد هذا في تجاوز الأعطال عند تشغيل ألعاب معينة.\n\nاتركه معطلا إذا كنت غير متأكد.",
|
||||
"de_DE": "Durch diese Option werden nicht implementierte Dienste der Switch-Firmware ignoriert. Dies kann dabei helfen, Abstürze beim Starten bestimmter Spiele zu umgehen.\n\nIm Zweifelsfall AUS lassen.",
|
||||
"el_GR": "Ενεργοποίηση ή απενεργοποίηση της αγνοώησης για υπηρεσίες που λείπουν",
|
||||
"en_US": "Ignores unimplemented Horizon OS services. This may help in bypassing crashes when booting certain games.\n\nLeave OFF if unsure.",
|
||||
"es_ES": "Hack para ignorar servicios no implementados del Horizon OS. Esto puede ayudar a sobrepasar crasheos cuando inicies ciertos juegos.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"fr_FR": "Ignore les services Horizon OS non-intégrés. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nLaissez désactivé en cas d'incertitude.",
|
||||
"he_IL": "מתעלם מפעולות שלא קיבלו מימוש במערכת ההפעלה Horizon OS. זה עלול לעזור לעקוף קריסות של היישום במשחקים מסויימים.\n\nמוטב להשאיר כבוי אם לא בטוחים.",
|
||||
"it_IT": "Ignora i servizi non implementati del sistema operativo Horizon. Può aiutare ad aggirare gli arresti anomali che si verificano avviando alcuni giochi.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"ja_JP": "未実装の Horizon OS サービスを無視します. 特定のゲームにおいて起動時のクラッシュを回避できる場合があります.\n\nよくわからない場合はオフのままにしてください.",
|
||||
"ko_KR": "구현되지 않은 Horizon OS 서비스는 무시됩니다. 특정 게임을 부팅할 때, 발생하는 충돌을 우회하는 데 도움이 될 수 있습니다.\n\n모르면 끔으로 두세요.",
|
||||
"no_NO": "Ignorerer ikke implementerte Horisont OS-tjenester. Dette kan hjelpe med å omgå krasj ved oppstart av enkelte spill.\n\nLa AV hvis du er usikker.",
|
||||
"pl_PL": "Ignoruje niezaimplementowane usługi Horizon OS. Może to pomóc w ominięciu awarii podczas uruchamiania niektórych gier.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.",
|
||||
"pt_BR": "Ignora serviços não implementados do Horizon OS. Isso pode ajudar a contornar travamentos ao inicializar certos jogos.\n\nDeixe OFF se não tiver certeza.",
|
||||
"ru_RU": "Игнорирует нереализованные сервисы Horizon в новых прошивках. Эта настройка поможет избежать вылеты при запуске определенных игр.\n\nРекомендуется оставить выключенным.",
|
||||
"sv_SE": "Ignorerar Horizon OS-tjänster som inte har implementerats. Detta kan avhjälpa krascher när vissa spel startar upp.\n\nLämna AV om du är osäker.",
|
||||
"th_TH": "ละเว้นบริการ Horizon OS ที่ยังไม่ได้ใช้งาน วิธีนี้อาจช่วยในการหลีกเลี่ยงข้อผิดพลาดเมื่อบูตเกมบางเกม\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ",
|
||||
"tr_TR": "Henüz programlanmamış Horizon işletim sistemi servislerini görmezden gelir. Bu seçenek belirli oyunların açılırken çökmesinin önüne geçmeye yardımcı olabilir.\n\nEmin değilseniz devre dışı bırakın.",
|
||||
"uk_UA": "Ігнорує нереалізовані служби Horizon OS. Це може допомогти в обході збоїв під час завантаження певних ігор.\n\nЗалиште вимкненим якщо не впевнені.",
|
||||
"zh_CN": "开启后,游戏会忽略未实现的系统服务,从而继续运行。\n少部分新发布的游戏由于使用了新的未知系统服务,可能需要此选项来避免闪退。\n模拟器更新完善系统服务之后,则无需开启此选项。\n\n如果不确定,请保持关闭状态。",
|
||||
"zh_TW": "忽略未實現的 Horizon OS 服務。這可能有助於在啟動某些遊戲時避免崩潰。\n\n如果不確定,請保持關閉狀態。"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "IgnoreControllerAppletTooltip",
|
||||
"Translations": {
|
||||
|
|
|
@ -314,6 +314,7 @@ namespace Ryujinx.Headless
|
|||
|
||||
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) =>
|
||||
new(
|
||||
#if DEBUG
|
||||
new HleConfiguration(
|
||||
options.DramSize,
|
||||
options.SystemLanguage,
|
||||
|
@ -338,6 +339,31 @@ namespace Ryujinx.Headless
|
|||
string.Empty,
|
||||
options.CustomVSyncInterval
|
||||
)
|
||||
#else
|
||||
new HleConfiguration(
|
||||
options.DramSize,
|
||||
options.SystemLanguage,
|
||||
options.SystemRegion,
|
||||
options.VSyncMode,
|
||||
!options.DisableDockedMode,
|
||||
!options.DisablePTC,
|
||||
options.EnableInternetAccess,
|
||||
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||
options.FsGlobalAccessLogMode,
|
||||
options.SystemTimeOffset,
|
||||
options.SystemTimeZone,
|
||||
options.MemoryManagerMode,
|
||||
options.AspectRatio,
|
||||
options.AudioVolume,
|
||||
options.UseHypervisor ?? true,
|
||||
options.MultiplayerLanInterfaceId,
|
||||
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
||||
false,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
options.CustomVSyncInterval
|
||||
)
|
||||
#endif
|
||||
.Configure(
|
||||
_virtualFileSystem,
|
||||
_libHacHorizonManager,
|
||||
|
|
|
@ -145,9 +145,6 @@ namespace Ryujinx.Headless
|
|||
if (NeedsOverride(nameof(DramSize)))
|
||||
DramSize = configurationState.System.DramSize;
|
||||
|
||||
if (NeedsOverride(nameof(IgnoreMissingServices)))
|
||||
IgnoreMissingServices = configurationState.System.IgnoreMissingServices;
|
||||
|
||||
if (NeedsOverride(nameof(IgnoreControllerApplet)))
|
||||
IgnoreControllerApplet = configurationState.System.IgnoreControllerApplet;
|
||||
|
||||
|
@ -408,8 +405,10 @@ namespace Ryujinx.Headless
|
|||
[Option("dram-size", Required = false, Default = MemoryConfiguration.MemoryConfiguration4GiB, HelpText = "Set the RAM amount on the emulated system.")]
|
||||
public MemoryConfiguration DramSize { get; set; }
|
||||
|
||||
#if DEBUG
|
||||
[Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")]
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
#endif
|
||||
|
||||
[Option("ignore-controller-applet", Required = false, Default = false, HelpText = "Enable ignoring the controller applet when your game loses connection to your controller.")]
|
||||
public bool IgnoreControllerApplet { get; set; }
|
||||
|
|
|
@ -194,7 +194,6 @@ namespace Ryujinx.Ava.Systems
|
|||
_defaultCursorWin = CreateArrowCursor();
|
||||
}
|
||||
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices.Event += UpdateIgnoreMissingServicesState;
|
||||
ConfigurationState.Instance.Graphics.AspectRatio.Event += UpdateAspectRatioState;
|
||||
ConfigurationState.Instance.System.EnableDockedMode.Event += UpdateDockedModeState;
|
||||
ConfigurationState.Instance.System.AudioVolume.Event += UpdateAudioVolumeState;
|
||||
|
@ -487,14 +486,6 @@ namespace Ryujinx.Ava.Systems
|
|||
Exit();
|
||||
}
|
||||
|
||||
private void UpdateIgnoreMissingServicesState(object sender, ReactiveEventArgs<bool> args)
|
||||
{
|
||||
if (Device != null)
|
||||
{
|
||||
Device.Configuration.IgnoreMissingServices = args.NewValue;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAspectRatioState(object sender, ReactiveEventArgs<AspectRatio> args)
|
||||
{
|
||||
if (Device != null)
|
||||
|
@ -608,9 +599,7 @@ namespace Ryujinx.Ava.Systems
|
|||
{
|
||||
if (Device.Processes != null)
|
||||
MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText);
|
||||
|
||||
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
|
||||
|
||||
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
|
||||
ConfigurationState.Instance.System.EnableDockedMode.Event -= UpdateDockedModeState;
|
||||
ConfigurationState.Instance.System.AudioVolume.Event -= UpdateAudioVolumeState;
|
||||
|
|
|
@ -294,11 +294,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
/// </summary>
|
||||
public MemoryConfiguration DramSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enable or disable ignoring missing services
|
||||
/// </summary>
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Used to toggle columns in the GUI
|
||||
/// </summary>
|
||||
|
|
|
@ -100,7 +100,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
System.AudioVolume.Value = cff.AudioVolume;
|
||||
System.MemoryManagerMode.Value = cff.MemoryManagerMode;
|
||||
System.DramSize.Value = cff.DramSize;
|
||||
System.IgnoreMissingServices.Value = cff.IgnoreMissingServices;
|
||||
System.IgnoreControllerApplet.Value = cff.IgnoreApplet;
|
||||
System.UseHypervisor.Value = cff.UseHypervisor;
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ using Gommon;
|
|||
using LibHac.Tools.FsSystem;
|
||||
using Ryujinx.Ava.Systems.Configuration.System;
|
||||
using Ryujinx.Ava.Systems.Configuration.UI;
|
||||
using Ryujinx.Ava.Utilities;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
|
@ -379,11 +380,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
/// Defines the amount of RAM available on the emulated system, and how it is distributed
|
||||
/// </summary>
|
||||
public ReactiveObject<MemoryConfiguration> DramSize { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enable or disable ignoring missing services
|
||||
/// </summary>
|
||||
public ReactiveObject<bool> IgnoreMissingServices { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ignore Controller Applet
|
||||
|
@ -427,8 +423,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
MemoryManagerMode.LogChangesToValue(nameof(MemoryManagerMode));
|
||||
DramSize = new ReactiveObject<MemoryConfiguration>();
|
||||
DramSize.LogChangesToValue(nameof(DramSize));
|
||||
IgnoreMissingServices = new ReactiveObject<bool>();
|
||||
IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices));
|
||||
IgnoreControllerApplet = new ReactiveObject<bool>();
|
||||
IgnoreControllerApplet.LogChangesToValue(nameof(IgnoreControllerApplet));
|
||||
AudioVolume = new ReactiveObject<float>();
|
||||
|
@ -835,6 +829,7 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
}
|
||||
|
||||
public HleConfiguration CreateHleConfiguration() =>
|
||||
#if DEBUG
|
||||
new(
|
||||
System.DramSize,
|
||||
System.Language.Value.ToHLE(),
|
||||
|
@ -852,7 +847,7 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
: System.SystemTimeOffset,
|
||||
System.TimeZone,
|
||||
System.MemoryManagerMode,
|
||||
System.IgnoreMissingServices,
|
||||
CommandLineState.IgnoreMissingServices,
|
||||
Graphics.AspectRatio,
|
||||
System.AudioVolume,
|
||||
System.UseHypervisor,
|
||||
|
@ -863,5 +858,34 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
Instance.Multiplayer.GetLdnServer(),
|
||||
Instance.Graphics.CustomVSyncInterval,
|
||||
Instance.Hacks.ShowDirtyHacks ? Instance.Hacks.EnabledHacks : null);
|
||||
#else
|
||||
new(
|
||||
System.DramSize,
|
||||
System.Language.Value.ToHLE(),
|
||||
System.Region.Value.ToHLE(),
|
||||
Graphics.VSyncMode,
|
||||
System.EnableDockedMode,
|
||||
System.EnablePtc,
|
||||
System.EnableInternetAccess,
|
||||
System.EnableFsIntegrityChecks
|
||||
? IntegrityCheckLevel.ErrorOnInvalid
|
||||
: IntegrityCheckLevel.None,
|
||||
System.FsGlobalAccessLogMode,
|
||||
System.MatchSystemTime
|
||||
? 0
|
||||
: System.SystemTimeOffset,
|
||||
System.TimeZone,
|
||||
System.MemoryManagerMode,
|
||||
Graphics.AspectRatio,
|
||||
System.AudioVolume,
|
||||
System.UseHypervisor,
|
||||
Multiplayer.LanInterfaceId,
|
||||
Multiplayer.Mode,
|
||||
Multiplayer.DisableP2p,
|
||||
Multiplayer.LdnPassphrase,
|
||||
Instance.Multiplayer.GetLdnServer(),
|
||||
Instance.Graphics.CustomVSyncInterval,
|
||||
Instance.Hacks.ShowDirtyHacks ? Instance.Hacks.EnabledHacks : null);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,7 +79,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
AudioVolume = System.AudioVolume,
|
||||
MemoryManagerMode = System.MemoryManagerMode,
|
||||
DramSize = System.DramSize,
|
||||
IgnoreMissingServices = System.IgnoreMissingServices,
|
||||
IgnoreApplet = System.IgnoreControllerApplet,
|
||||
UseHypervisor = System.UseHypervisor,
|
||||
GuiColumns = new GuiColumns
|
||||
|
@ -203,7 +202,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||
System.AudioVolume.Value = 1;
|
||||
System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe;
|
||||
System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB;
|
||||
System.IgnoreMissingServices.Value = false;
|
||||
System.IgnoreControllerApplet.Value = false;
|
||||
System.UseHypervisor.Value = true;
|
||||
Multiplayer.LanInterfaceId.Value = "0";
|
||||
|
|
|
@ -208,7 +208,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
public bool EnableLowPowerPptc { get; set; }
|
||||
public bool EnableInternetAccess { get; set; }
|
||||
public bool EnableFsIntegrityChecks { get; set; }
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
public MemoryConfiguration DramSize { get; set; }
|
||||
public bool EnableShaderCache { get; set; }
|
||||
public bool EnableTextureRecompression { get; set; }
|
||||
|
@ -584,7 +583,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
VSyncMode = config.Graphics.VSyncMode;
|
||||
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks;
|
||||
DramSize = config.System.DramSize;
|
||||
IgnoreMissingServices = config.System.IgnoreMissingServices;
|
||||
IgnoreApplet = config.System.IgnoreControllerApplet;
|
||||
|
||||
// CPU
|
||||
|
@ -686,7 +684,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds());
|
||||
config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks;
|
||||
config.System.DramSize.Value = DramSize;
|
||||
config.System.IgnoreMissingServices.Value = IgnoreMissingServices;
|
||||
config.System.IgnoreControllerApplet.Value = IgnoreApplet;
|
||||
|
||||
// CPU
|
||||
|
|
|
@ -313,11 +313,6 @@
|
|||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical">
|
||||
<CheckBox
|
||||
IsChecked="{Binding IgnoreMissingServices}"
|
||||
ToolTip.Tip="{ext:Locale IgnoreMissingServicesTooltip}">
|
||||
<TextBlock Text="{ext:Locale SettingsTabSystemIgnoreMissingServices}" />
|
||||
</CheckBox>
|
||||
<CheckBox
|
||||
IsChecked="{Binding IgnoreApplet}"
|
||||
ToolTip.Tip="{ext:Locale IgnoreControllerAppletTooltip}">
|
||||
|
|
|
@ -26,6 +26,9 @@ namespace Ryujinx.Ava.Utilities
|
|||
public static bool StartFullscreenArg { get; private set; }
|
||||
public static bool HideAvailableUpdates { get; private set; }
|
||||
|
||||
#if DEBUG
|
||||
public static bool IgnoreMissingServices { get; private set; }
|
||||
#endif
|
||||
|
||||
public static void ParseArguments(string[] args)
|
||||
{
|
||||
|
@ -185,6 +188,11 @@ namespace Ryujinx.Ava.Utilities
|
|||
case "--hide-updates":
|
||||
HideAvailableUpdates = true;
|
||||
break;
|
||||
#if DEBUG
|
||||
case "--ignore-missing-services":
|
||||
IgnoreMissingServices = true;
|
||||
break;
|
||||
#endif
|
||||
case "--software-gui":
|
||||
OverrideHardwareAcceleration = false;
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue