Merge branch 'removal/ims' into 'master'

Make 'Ignore Missing Services' Debug-only

See merge request ryubing/ryujinx!16
This commit is contained in:
GreemDev 2025-03-29 02:40:04 -05:00
commit 15b9d2ecac
18 changed files with 143 additions and 124 deletions

View file

@ -265,13 +265,25 @@ namespace Ryujinx.HLE.HOS
HorizonFsClient fsClient = new(this); HorizonFsClient fsClient = new(this);
ServiceTable = new ServiceTable(); 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, LibHacHorizonManager.BcatClient,
fsClient, fsClient,
AccountManager, AccountManager,
Device.AudioDeviceDriver, Device.AudioDeviceDriver,
TickSource)); TickSource
#else
LibHacHorizonManager.BcatClient,
fsClient,
AccountManager,
Device.AudioDeviceDriver,
TickSource
#endif
));
foreach (ServiceEntry service in services) foreach (ServiceEntry service in services)
{ {

View file

@ -135,7 +135,8 @@ namespace Ryujinx.HLE.HOS.Services
int commandId = (int)context.RequestData.ReadInt64(); int commandId = (int)context.RequestData.ReadInt64();
bool serviceExists = service.CmifCommands.TryGetValue(commandId, out MethodInfo processRequest); bool serviceExists = service.CmifCommands.TryGetValue(commandId, out MethodInfo processRequest);
#if DEBUG
if (context.Device.Configuration.IgnoreMissingServices || serviceExists) if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
{ {
ResultCode result = ResultCode.Success; ResultCode result = ResultCode.Success;
@ -178,6 +179,39 @@ namespace Ryujinx.HLE.HOS.Services
throw new ServiceNotImplementedException(service, context, dbgMessage); 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) public void CallTipcMethod(ServiceCtx context)
@ -186,6 +220,7 @@ namespace Ryujinx.HLE.HOS.Services
bool serviceExists = TipcCommands.TryGetValue(commandId, out MethodInfo processRequest); bool serviceExists = TipcCommands.TryGetValue(commandId, out MethodInfo processRequest);
#if DEBUG
if (context.Device.Configuration.IgnoreMissingServices || serviceExists) if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
{ {
ResultCode result = ResultCode.Success; ResultCode result = ResultCode.Success;
@ -218,6 +253,26 @@ namespace Ryujinx.HLE.HOS.Services
throw new ServiceNotImplementedException(this, context, dbgMessage); 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) protected void MakeObject(ServiceCtx context, IpcService obj)

View file

@ -102,11 +102,13 @@ namespace Ryujinx.HLE.HOS.Services.Sm
} }
else else
{ {
#if DEBUG
if (context.Device.Configuration.IgnoreMissingServices) if (context.Device.Configuration.IgnoreMissingServices)
{ {
Logger.Warning?.Print(LogClass.Service, $"Missing service {name} ignored"); Logger.Warning?.Print(LogClass.Service, $"Missing service {name} ignored");
} }
else else
#endif
{ {
throw new NotImplementedException(name); throw new NotImplementedException(name);
} }

View file

@ -142,12 +142,14 @@ namespace Ryujinx.HLE
/// </summary> /// </summary>
public MemoryManagerMode MemoryManagerMode { internal get; set; } public MemoryManagerMode MemoryManagerMode { internal get; set; }
#if DEBUG
/// <summary> /// <summary>
/// Control the initial state of the ignore missing services setting. /// 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. /// 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> /// </summary>
/// TODO: Update this again. /// TODO: Update this again.
public bool IgnoreMissingServices { internal get; set; } public bool IgnoreMissingServices { get; set; }
#endif
/// <summary> /// <summary>
/// Aspect Ratio applied to the renderer window by the SurfaceFlinger service. /// Aspect Ratio applied to the renderer window by the SurfaceFlinger service.
@ -213,7 +215,9 @@ namespace Ryujinx.HLE
long systemTimeOffset, long systemTimeOffset,
string timeZone, string timeZone,
MemoryManagerMode memoryManagerMode, MemoryManagerMode memoryManagerMode,
#if DEBUG
bool ignoreMissingServices, bool ignoreMissingServices,
#endif
AspectRatio aspectRatio, AspectRatio aspectRatio,
float audioVolume, float audioVolume,
bool useHypervisor, bool useHypervisor,
@ -239,7 +243,9 @@ namespace Ryujinx.HLE
SystemTimeOffset = systemTimeOffset; SystemTimeOffset = systemTimeOffset;
TimeZone = timeZone; TimeZone = timeZone;
MemoryManagerMode = memoryManagerMode; MemoryManagerMode = memoryManagerMode;
#if DEBUG
IgnoreMissingServices = ignoreMissingServices; IgnoreMissingServices = ignoreMissingServices;
#endif
AspectRatio = aspectRatio; AspectRatio = aspectRatio;
AudioVolume = audioVolume; AudioVolume = audioVolume;
UseHypervisor = useHypervisor; UseHypervisor = useHypervisor;

View file

@ -4,6 +4,7 @@ using Ryujinx.Audio.Backends.CompatLayer;
using Ryujinx.Audio.Integration; using Ryujinx.Audio.Integration;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Cpu; using Ryujinx.Cpu;
using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
@ -93,6 +94,11 @@ namespace Ryujinx.HLE
UpdateVSyncInterval(); UpdateVSyncInterval();
#pragma warning restore IDE0055 #pragma warning restore IDE0055
#if DEBUG
if (Configuration.IgnoreMissingServices)
Logger.Notice.Print(LogClass.Emulation, "Ignore Missing Services is enabled.", nameof(Switch));
#endif
Shared = this; Shared = this;
} }

View file

@ -8,7 +8,9 @@ namespace Ryujinx.Horizon
{ {
public readonly struct HorizonOptions public readonly struct HorizonOptions
{ {
#if DEBUG
public bool IgnoreMissingServices { get; } public bool IgnoreMissingServices { get; }
#endif
public bool ThrowOnInvalidCommandIds { get; } public bool ThrowOnInvalidCommandIds { get; }
public HorizonClient BcatClient { get; } public HorizonClient BcatClient { get; }
@ -18,14 +20,18 @@ namespace Ryujinx.Horizon
public ITickSource TickSource { get; } public ITickSource TickSource { get; }
public HorizonOptions( public HorizonOptions(
#if DEBUG
bool ignoreMissingServices, bool ignoreMissingServices,
#endif
HorizonClient bcatClient, HorizonClient bcatClient,
IFsClient fsClient, IFsClient fsClient,
IEmulatorAccountManager accountManager, IEmulatorAccountManager accountManager,
IHardwareDeviceDriver audioDeviceDriver, IHardwareDeviceDriver audioDeviceDriver,
ITickSource tickSource) ITickSource tickSource)
{ {
#if DEBUG
IgnoreMissingServices = ignoreMissingServices; IgnoreMissingServices = ignoreMissingServices;
#endif
ThrowOnInvalidCommandIds = true; ThrowOnInvalidCommandIds = true;
BcatClient = bcatClient; BcatClient = bcatClient;
FsClient = fsClient; FsClient = fsClient;

View file

@ -39,6 +39,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
if (!entries.TryGetValue((int)commandId, out CommandHandler commandHandler)) if (!entries.TryGetValue((int)commandId, out CommandHandler commandHandler))
{ {
#if DEBUG
if (HorizonStatic.Options.IgnoreMissingServices) if (HorizonStatic.Options.IgnoreMissingServices)
{ {
// If ignore missing services is enabled, just pretend that everything is fine. // 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"); Logger.Warning?.Print(LogClass.Service, $"Missing service {objectName} (command ID: {commandId}) ignored");
return Result.Success; return Result.Success;
} }
else if (HorizonStatic.Options.ThrowOnInvalidCommandIds) #endif
if (HorizonStatic.Options.ThrowOnInvalidCommandIds)
{ {
throw new NotImplementedException($"{objectName} command ID: {commandId} is not implemented"); throw new NotImplementedException($"{objectName} command ID: {commandId} is not implemented");
} }

View file

@ -5322,31 +5322,6 @@
"zh_TW": "" "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", "ID": "SettingsTabSystemIgnoreControllerApplet",
"Translations": { "Translations": {
@ -16722,31 +16697,6 @@
"zh_TW": "利用另一種 MemoryMode 配置來模仿 Switch 開發模式。\n\n這僅對高解析度紋理套件或 4K 解析度模組有用。不會提高效能。\n\n如果不確定請設定為 4GiB。" "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", "ID": "IgnoreControllerAppletTooltip",
"Translations": { "Translations": {

View file

@ -312,34 +312,37 @@ namespace Ryujinx.Headless
return new OpenGLRenderer(); return new OpenGLRenderer();
} }
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) => private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) =>
new( new(
new HleConfiguration( new HleConfiguration(
options.DramSize, options.DramSize,
options.SystemLanguage, options.SystemLanguage,
options.SystemRegion, options.SystemRegion,
options.VSyncMode, options.VSyncMode,
!options.DisableDockedMode, !options.DisableDockedMode,
!options.DisablePTC, !options.DisablePTC,
ITickSource.RealityTickScalar, ITickSource.RealityTickScalar,
options.EnableInternetAccess, options.EnableInternetAccess,
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
options.FsGlobalAccessLogMode, options.FsGlobalAccessLogMode,
options.SystemTimeOffset, options.SystemTimeOffset,
options.SystemTimeZone, options.SystemTimeZone,
options.MemoryManagerMode, options.MemoryManagerMode,
options.IgnoreMissingServices, #if DEBUG
options.AspectRatio, options.IgnoreMissingServices,
options.AudioVolume, #endif
options.UseHypervisor ?? true, options.AspectRatio,
options.MultiplayerLanInterfaceId, options.AudioVolume,
Common.Configuration.Multiplayer.MultiplayerMode.Disabled, options.UseHypervisor ?? true,
false, options.MultiplayerLanInterfaceId,
string.Empty, Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
string.Empty, false,
options.CustomVSyncInterval string.Empty,
) string.Empty,
options.CustomVSyncInterval
)
.Configure( .Configure(
_virtualFileSystem, _virtualFileSystem,
_libHacHorizonManager, _libHacHorizonManager,

View file

@ -145,9 +145,6 @@ namespace Ryujinx.Headless
if (NeedsOverride(nameof(DramSize))) if (NeedsOverride(nameof(DramSize)))
DramSize = configurationState.System.DramSize; DramSize = configurationState.System.DramSize;
if (NeedsOverride(nameof(IgnoreMissingServices)))
IgnoreMissingServices = configurationState.System.IgnoreMissingServices;
if (NeedsOverride(nameof(IgnoreControllerApplet))) if (NeedsOverride(nameof(IgnoreControllerApplet)))
IgnoreControllerApplet = configurationState.System.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.")] [Option("dram-size", Required = false, Default = MemoryConfiguration.MemoryConfiguration4GiB, HelpText = "Set the RAM amount on the emulated system.")]
public MemoryConfiguration DramSize { get; set; } public MemoryConfiguration DramSize { get; set; }
#if DEBUG
[Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")] [Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")]
public bool IgnoreMissingServices { get; set; } 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.")] [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; } public bool IgnoreControllerApplet { get; set; }

View file

@ -195,7 +195,6 @@ namespace Ryujinx.Ava.Systems
_defaultCursorWin = CreateArrowCursor(); _defaultCursorWin = CreateArrowCursor();
} }
ConfigurationState.Instance.System.IgnoreMissingServices.Event += UpdateIgnoreMissingServicesState;
ConfigurationState.Instance.Graphics.AspectRatio.Event += UpdateAspectRatioState; ConfigurationState.Instance.Graphics.AspectRatio.Event += UpdateAspectRatioState;
ConfigurationState.Instance.System.EnableDockedMode.Event += UpdateDockedModeState; ConfigurationState.Instance.System.EnableDockedMode.Event += UpdateDockedModeState;
ConfigurationState.Instance.System.AudioVolume.Event += UpdateAudioVolumeState; ConfigurationState.Instance.System.AudioVolume.Event += UpdateAudioVolumeState;
@ -488,14 +487,6 @@ namespace Ryujinx.Ava.Systems
Exit(); 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) private void UpdateAspectRatioState(object sender, ReactiveEventArgs<AspectRatio> args)
{ {
if (Device != null) if (Device != null)
@ -609,9 +600,7 @@ namespace Ryujinx.Ava.Systems
{ {
if (Device.Processes != null) if (Device.Processes != null)
MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText); MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText);
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState; ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
ConfigurationState.Instance.System.EnableDockedMode.Event -= UpdateDockedModeState; ConfigurationState.Instance.System.EnableDockedMode.Event -= UpdateDockedModeState;
ConfigurationState.Instance.System.AudioVolume.Event -= UpdateAudioVolumeState; ConfigurationState.Instance.System.AudioVolume.Event -= UpdateAudioVolumeState;

View file

@ -299,11 +299,6 @@ namespace Ryujinx.Ava.Systems.Configuration
/// </summary> /// </summary>
public MemoryConfiguration DramSize { get; set; } public MemoryConfiguration DramSize { get; set; }
/// <summary>
/// Enable or disable ignoring missing services
/// </summary>
public bool IgnoreMissingServices { get; set; }
/// <summary> /// <summary>
/// Used to toggle columns in the GUI /// Used to toggle columns in the GUI
/// </summary> /// </summary>

View file

@ -101,7 +101,6 @@ namespace Ryujinx.Ava.Systems.Configuration
System.AudioVolume.Value = cff.AudioVolume; System.AudioVolume.Value = cff.AudioVolume;
System.MemoryManagerMode.Value = cff.MemoryManagerMode; System.MemoryManagerMode.Value = cff.MemoryManagerMode;
System.DramSize.Value = cff.DramSize; System.DramSize.Value = cff.DramSize;
System.IgnoreMissingServices.Value = cff.IgnoreMissingServices;
System.IgnoreControllerApplet.Value = cff.IgnoreApplet; System.IgnoreControllerApplet.Value = cff.IgnoreApplet;
System.UseHypervisor.Value = cff.UseHypervisor; System.UseHypervisor.Value = cff.UseHypervisor;

View file

@ -3,6 +3,7 @@ using Gommon;
using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem;
using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Ava.Systems.Configuration.System;
using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Ava.Systems.Configuration.UI;
using Ryujinx.Ava.Utilities;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid;
@ -384,11 +385,6 @@ namespace Ryujinx.Ava.Systems.Configuration
/// Defines the amount of RAM available on the emulated system, and how it is distributed /// Defines the amount of RAM available on the emulated system, and how it is distributed
/// </summary> /// </summary>
public ReactiveObject<MemoryConfiguration> DramSize { get; private set; } public ReactiveObject<MemoryConfiguration> DramSize { get; private set; }
/// <summary>
/// Enable or disable ignoring missing services
/// </summary>
public ReactiveObject<bool> IgnoreMissingServices { get; private set; }
/// <summary> /// <summary>
/// Ignore Controller Applet /// Ignore Controller Applet
@ -441,8 +437,6 @@ namespace Ryujinx.Ava.Systems.Configuration
MemoryManagerMode.LogChangesToValue(nameof(MemoryManagerMode)); MemoryManagerMode.LogChangesToValue(nameof(MemoryManagerMode));
DramSize = new ReactiveObject<MemoryConfiguration>(); DramSize = new ReactiveObject<MemoryConfiguration>();
DramSize.LogChangesToValue(nameof(DramSize)); DramSize.LogChangesToValue(nameof(DramSize));
IgnoreMissingServices = new ReactiveObject<bool>();
IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices));
IgnoreControllerApplet = new ReactiveObject<bool>(); IgnoreControllerApplet = new ReactiveObject<bool>();
IgnoreControllerApplet.LogChangesToValue(nameof(IgnoreControllerApplet)); IgnoreControllerApplet.LogChangesToValue(nameof(IgnoreControllerApplet));
AudioVolume = new ReactiveObject<float>(); AudioVolume = new ReactiveObject<float>();
@ -867,7 +861,9 @@ namespace Ryujinx.Ava.Systems.Configuration
: System.SystemTimeOffset, : System.SystemTimeOffset,
System.TimeZone, System.TimeZone,
System.MemoryManagerMode, System.MemoryManagerMode,
System.IgnoreMissingServices, #if DEBUG
CommandLineState.IgnoreMissingServices,
#endif
Graphics.AspectRatio, Graphics.AspectRatio,
System.AudioVolume, System.AudioVolume,
System.UseHypervisor, System.UseHypervisor,
@ -875,8 +871,8 @@ namespace Ryujinx.Ava.Systems.Configuration
Multiplayer.Mode, Multiplayer.Mode,
Multiplayer.DisableP2p, Multiplayer.DisableP2p,
Multiplayer.LdnPassphrase, Multiplayer.LdnPassphrase,
Multiplayer.GetLdnServer(), Instance.Multiplayer.GetLdnServer(),
Graphics.CustomVSyncInterval, Instance.Graphics.CustomVSyncInterval,
Hacks.ShowDirtyHacks ? Hacks.EnabledHacks : null); Instance.Hacks.ShowDirtyHacks ? Instance.Hacks.EnabledHacks : null);
} }
} }

View file

@ -80,7 +80,6 @@ namespace Ryujinx.Ava.Systems.Configuration
AudioVolume = System.AudioVolume, AudioVolume = System.AudioVolume,
MemoryManagerMode = System.MemoryManagerMode, MemoryManagerMode = System.MemoryManagerMode,
DramSize = System.DramSize, DramSize = System.DramSize,
IgnoreMissingServices = System.IgnoreMissingServices,
IgnoreApplet = System.IgnoreControllerApplet, IgnoreApplet = System.IgnoreControllerApplet,
UseHypervisor = System.UseHypervisor, UseHypervisor = System.UseHypervisor,
GuiColumns = new GuiColumns GuiColumns = new GuiColumns
@ -204,7 +203,6 @@ namespace Ryujinx.Ava.Systems.Configuration
System.AudioVolume.Value = 1; System.AudioVolume.Value = 1;
System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe; System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe;
System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB; System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB;
System.IgnoreMissingServices.Value = false;
System.IgnoreControllerApplet.Value = false; System.IgnoreControllerApplet.Value = false;
System.UseHypervisor.Value = true; System.UseHypervisor.Value = true;
Multiplayer.LanInterfaceId.Value = "0"; Multiplayer.LanInterfaceId.Value = "0";

View file

@ -228,7 +228,6 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool EnableInternetAccess { get; set; } public bool EnableInternetAccess { get; set; }
public bool EnableFsIntegrityChecks { get; set; } public bool EnableFsIntegrityChecks { get; set; }
public bool IgnoreMissingServices { get; set; }
public MemoryConfiguration DramSize { get; set; } public MemoryConfiguration DramSize { get; set; }
public bool EnableShaderCache { get; set; } public bool EnableShaderCache { get; set; }
public bool EnableTextureRecompression { get; set; } public bool EnableTextureRecompression { get; set; }
@ -604,7 +603,6 @@ namespace Ryujinx.Ava.UI.ViewModels
VSyncMode = config.Graphics.VSyncMode; VSyncMode = config.Graphics.VSyncMode;
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks; EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks;
DramSize = config.System.DramSize; DramSize = config.System.DramSize;
IgnoreMissingServices = config.System.IgnoreMissingServices;
IgnoreApplet = config.System.IgnoreControllerApplet; IgnoreApplet = config.System.IgnoreControllerApplet;
// CPU // CPU
@ -707,7 +705,6 @@ namespace Ryujinx.Ava.UI.ViewModels
config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds()); config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds());
config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks; config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks;
config.System.DramSize.Value = DramSize; config.System.DramSize.Value = DramSize;
config.System.IgnoreMissingServices.Value = IgnoreMissingServices;
config.System.IgnoreControllerApplet.Value = IgnoreApplet; config.System.IgnoreControllerApplet.Value = IgnoreApplet;
// CPU // CPU

View file

@ -313,11 +313,6 @@
Margin="10,0,0,0" Margin="10,0,0,0"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Orientation="Vertical"> Orientation="Vertical">
<CheckBox
IsChecked="{Binding IgnoreMissingServices}"
ToolTip.Tip="{ext:Locale IgnoreMissingServicesTooltip}">
<TextBlock Text="{ext:Locale SettingsTabSystemIgnoreMissingServices}" />
</CheckBox>
<CheckBox <CheckBox
IsChecked="{Binding IgnoreApplet}" IsChecked="{Binding IgnoreApplet}"
ToolTip.Tip="{ext:Locale IgnoreControllerAppletTooltip}"> ToolTip.Tip="{ext:Locale IgnoreControllerAppletTooltip}">

View file

@ -26,6 +26,9 @@ namespace Ryujinx.Ava.Utilities
public static bool StartFullscreenArg { get; private set; } public static bool StartFullscreenArg { get; private set; }
public static bool HideAvailableUpdates { 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) public static void ParseArguments(string[] args)
{ {
@ -185,6 +188,11 @@ namespace Ryujinx.Ava.Utilities
case "--hide-updates": case "--hide-updates":
HideAvailableUpdates = true; HideAvailableUpdates = true;
break; break;
#if DEBUG
case "--ignore-missing-services":
IgnoreMissingServices = true;
break;
#endif
case "--software-gui": case "--software-gui":
OverrideHardwareAcceleration = false; OverrideHardwareAcceleration = false;
break; break;