From da678d3438a94c4ee1b0385650d688bacffc3262 Mon Sep 17 00:00:00 2001 From: Jacobwasbeast Date: Tue, 11 Feb 2025 20:24:54 -0600 Subject: [PATCH] fix: implement real applets with stability improvements --- src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs | 2 ++ .../ILibraryRealAppletAccessor.cs | 12 ++++++------ .../SystemAppletProxy/IApplicationAccessor.cs | 6 +++--- .../SystemAppletProxy/IDisplayController.cs | 3 +++ src/Ryujinx.HLE/HOS/Services/ServerBase.cs | 8 ++++++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs b/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs index 71e50247a..65e2ff382 100644 --- a/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs +++ b/src/Ryujinx.HLE/HOS/Applets/WindowSystem.cs @@ -507,10 +507,12 @@ namespace Ryujinx.HLE.HOS.Applets if (child == _foregroundRequestedApplet) { UpdateAppletStateLocked(child, true); + _foregroundRequestedApplet.SetInteractibleLocked(true); } else { UpdateAppletStateLocked(child, isForeground); + _foregroundRequestedApplet.SetInteractibleLocked(isForeground); } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryRealAppletAccessor.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryRealAppletAccessor.cs index 9676b3873..9b0ebd50c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryRealAppletAccessor.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryRealAppletAccessor.cs @@ -135,9 +135,9 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Lib // RequestExit() public ResultCode RequestExit(ServiceCtx context) { - _applet.ProcessHandle.SetActivity(false); - _applet.AppletState.OnExitRequested(); - _applet?.ProcessHandle.Terminate(); + _applet?.ProcessHandle?.SetActivity(false); + _applet?.AppletState?.OnExitRequested(); + _applet?.ProcessHandle?.Terminate(); Logger.Stub?.PrintStub(LogClass.ServiceAm); return ResultCode.Success; @@ -147,9 +147,9 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Lib // Terminate() public ResultCode Terminate(ServiceCtx context) { - _applet.ProcessHandle.SetActivity(false); - _applet.AppletState.OnExitRequested(); - _applet?.ProcessHandle.Terminate(); + _applet?.ProcessHandle?.SetActivity(false); + _applet?.AppletState?.OnExitRequested(); + _applet?.ProcessHandle?.Terminate(); Logger.Stub?.PrintStub(LogClass.ServiceAm); return ResultCode.Success; } diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs index 46a015e94..93bc8097a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IApplicationAccessor.cs @@ -91,9 +91,9 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys // RequestExit() public ResultCode RequestExit(ServiceCtx context) { - applet.ProcessHandle.SetActivity(false); - applet.AppletState.OnExitRequested(); - applet?.ProcessHandle.Terminate(); + applet?.ProcessHandle?.SetActivity(false); + applet?.AppletState?.OnExitRequested(); + applet?.ProcessHandle?.Terminate(); Logger.Stub?.PrintStub(LogClass.ServiceAm); return ResultCode.Success; diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs index f0f09cbf4..dc218af84 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs @@ -81,6 +81,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys } [CommandCmif(18)] + [CommandCmif(23)] + [CommandCmif(25)] // AcquireCallerAppletCaptureBufferEx() -> (b8, handle) public ResultCode AcquireCallerAppletCaptureBufferEx(ServiceCtx context) { @@ -110,6 +112,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys byte unknown1 = context.RequestData.ReadByte(); int captureSharedBuffer = context.RequestData.ReadInt32(); uint color = context.RequestData.ReadUInt32(); + context.Device.System.ViServerS.CancelFrameBuffer(context.Device.System.ViServerS.GetSharedLayerId(),captureSharedBuffer); Logger.Stub?.PrintStub(LogClass.ServiceAm, new { unknown1, captureSharedBuffer }); return ResultCode.Success; } diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs index 82aa1ab64..232a3c3b2 100644 --- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -199,7 +199,7 @@ namespace Ryujinx.HLE.HOS.Services if (SmObjectFactory != null) { - _context.Syscall.ManageNamedPort(out int serverPortHandle, "sm:", 50); + _context.Syscall.ManageNamedPort(out int serverPortHandle, "sm:", 50).AbortOnFailure(); AddPort(serverPortHandle, SmObjectFactory); } @@ -304,10 +304,14 @@ namespace Ryujinx.HLE.HOS.Services _wakeEvent.WritableEvent.Clear(); } } - else if (rc == KernelResult.PortRemoteClosed && signaledIndex >= 0 && SmObjectFactory != null) + else if (rc == KernelResult.PortRemoteClosed && signaledIndex >= 0/* && SmObjectFactory != null*/) { DestroySession(handles[signaledIndex]); } + else + { + Logger.Warning?.Print(LogClass.Service, $"ReplyAndReceive failed with unknown result: {rc}"); + } _selfProcess.CpuMemory.Write(messagePtr + 0x0, 0); _selfProcess.CpuMemory.Write(messagePtr + 0x4, 2 << 10);