diff options
Diffstat (limited to 'src/Ryujinx.Horizon')
-rw-r--r-- | src/Ryujinx.Horizon/Bcat/BcatIpcServer.cs | 16 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/HorizonStatic.cs | 2 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Lbl/Ipc/LblController.cs | 130 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Lbl/LblIpcServer.cs | 43 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Lbl/LblMain.cs | 17 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/LogManager/LmIpcServer.cs | 8 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/MmNv/MmNvIpcServer.cs | 8 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs | 20 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/Lbl/ILblController.cs | 20 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs | 43 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs | 2 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/Sdk/Sm/SmApi.cs | 14 | ||||
-rw-r--r-- | src/Ryujinx.Horizon/ServiceTable.cs | 6 |
13 files changed, 298 insertions, 31 deletions
diff --git a/src/Ryujinx.Horizon/Bcat/BcatIpcServer.cs b/src/Ryujinx.Horizon/Bcat/BcatIpcServer.cs index f39929dd..5d01cd9d 100644 --- a/src/Ryujinx.Horizon/Bcat/BcatIpcServer.cs +++ b/src/Ryujinx.Horizon/Bcat/BcatIpcServer.cs @@ -6,8 +6,8 @@ namespace Ryujinx.Horizon.Bcat { internal class BcatIpcServer { - private const int BcatMaxSessionsCount = 8; - private const int BcatTotalMaxSessionsCount = BcatMaxSessionsCount * 4; + private const int MaxSessionsCount = 8; + private const int TotalMaxSessionsCount = MaxSessionsCount * 4; private const int PointerBufferSize = 0x400; private const int MaxDomains = 64; @@ -17,7 +17,7 @@ namespace Ryujinx.Horizon.Bcat private SmApi _sm; private BcatServerManager _serverManager; - private static readonly ManagerOptions _bcatManagerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); internal void Initialize() { @@ -26,13 +26,13 @@ namespace Ryujinx.Horizon.Bcat _sm = new SmApi(); _sm.Initialize().AbortOnFailure(); - _serverManager = new BcatServerManager(allocator, _sm, MaxPortsCount, _bcatManagerOptions, BcatTotalMaxSessionsCount); + _serverManager = new BcatServerManager(allocator, _sm, MaxPortsCount, _managerOptions, TotalMaxSessionsCount); #pragma warning disable IDE0055 // Disable formatting - _serverManager.RegisterServer((int)BcatPortIndex.Admin, ServiceName.Encode("bcat:a"), BcatMaxSessionsCount); - _serverManager.RegisterServer((int)BcatPortIndex.Manager, ServiceName.Encode("bcat:m"), BcatMaxSessionsCount); - _serverManager.RegisterServer((int)BcatPortIndex.User, ServiceName.Encode("bcat:u"), BcatMaxSessionsCount); - _serverManager.RegisterServer((int)BcatPortIndex.System, ServiceName.Encode("bcat:s"), BcatMaxSessionsCount); + _serverManager.RegisterServer((int)BcatPortIndex.Admin, ServiceName.Encode("bcat:a"), MaxSessionsCount); + _serverManager.RegisterServer((int)BcatPortIndex.Manager, ServiceName.Encode("bcat:m"), MaxSessionsCount); + _serverManager.RegisterServer((int)BcatPortIndex.User, ServiceName.Encode("bcat:u"), MaxSessionsCount); + _serverManager.RegisterServer((int)BcatPortIndex.System, ServiceName.Encode("bcat:s"), MaxSessionsCount); #pragma warning restore IDE0055 } diff --git a/src/Ryujinx.Horizon/HorizonStatic.cs b/src/Ryujinx.Horizon/HorizonStatic.cs index 1e483cd4..3e992ead 100644 --- a/src/Ryujinx.Horizon/HorizonStatic.cs +++ b/src/Ryujinx.Horizon/HorizonStatic.cs @@ -4,7 +4,7 @@ using System; namespace Ryujinx.Horizon { - static class HorizonStatic + public static class HorizonStatic { [ThreadStatic] private static HorizonOptions _options; diff --git a/src/Ryujinx.Horizon/Lbl/Ipc/LblController.cs b/src/Ryujinx.Horizon/Lbl/Ipc/LblController.cs new file mode 100644 index 00000000..0a27d5ef --- /dev/null +++ b/src/Ryujinx.Horizon/Lbl/Ipc/LblController.cs @@ -0,0 +1,130 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Lbl; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Lbl.Ipc +{ + partial class LblController : ILblController + { + private bool _vrModeEnabled; + private float _currentBrightnessSettingForVrMode; + + [CmifCommand(17)] + public Result SetBrightnessReflectionDelayLevel(float unknown0, float unknown1) + { + // NOTE: Stubbed in system module. + + return Result.Success; + } + + [CmifCommand(18)] + public Result GetBrightnessReflectionDelayLevel(out float unknown1, float unknown0) + { + // NOTE: Stubbed in system module. + + unknown1 = 0.0f; + + return Result.Success; + } + + [CmifCommand(19)] + public Result SetCurrentBrightnessMapping(float unknown0, float unknown1, float unknown2) + { + // NOTE: Stubbed in system module. + + return Result.Success; + } + + [CmifCommand(20)] + public Result GetCurrentBrightnessMapping(out float unknown0, out float unknown1, out float unknown2) + { + // NOTE: Stubbed in system module. + + unknown0 = 0.0f; + unknown1 = 0.0f; + unknown2 = 0.0f; + + return Result.Success; + } + + [CmifCommand(21)] + public Result SetCurrentAmbientLightSensorMapping(float unknown0, float unknown1, float unknown2) + { + // NOTE: Stubbed in system module. + + return Result.Success; + } + + [CmifCommand(22)] + public Result GetCurrentAmbientLightSensorMapping(out float unknown0, out float unknown1, out float unknown2) + { + // NOTE: Stubbed in system module. + + unknown0 = 0.0f; + unknown1 = 0.0f; + unknown2 = 0.0f; + + return Result.Success; + } + + [CmifCommand(24)] + public Result SetCurrentBrightnessSettingForVrMode(float currentBrightnessSettingForVrMode) + { + if (float.IsNaN(currentBrightnessSettingForVrMode) || float.IsInfinity(currentBrightnessSettingForVrMode)) + { + _currentBrightnessSettingForVrMode = 0.0f; + } + else + { + _currentBrightnessSettingForVrMode = currentBrightnessSettingForVrMode; + } + + return Result.Success; + } + + [CmifCommand(25)] + public Result GetCurrentBrightnessSettingForVrMode(out float currentBrightnessSettingForVrMode) + { + if (float.IsNaN(_currentBrightnessSettingForVrMode) || float.IsInfinity(_currentBrightnessSettingForVrMode)) + { + currentBrightnessSettingForVrMode = 0.0f; + } + else + { + currentBrightnessSettingForVrMode = _currentBrightnessSettingForVrMode; + } + + return Result.Success; + } + + [CmifCommand(26)] + public Result EnableVrMode() + { + _vrModeEnabled = true; + + // NOTE: The service checks _vrModeEnabled field value in a thread and then changes the screen brightness. + // Since we don't support that, it's fine to do nothing. + + return Result.Success; + } + + [CmifCommand(27)] + public Result DisableVrMode() + { + _vrModeEnabled = false; + + // NOTE: The service checks _vrModeEnabled field value in a thread and then changes the screen brightness. + // Since we don't support that, it's fine to do nothing. + + return Result.Success; + } + + [CmifCommand(28)] + public Result IsVrModeEnabled(out bool vrModeEnabled) + { + vrModeEnabled = _vrModeEnabled; + + return Result.Success; + } + } +} diff --git a/src/Ryujinx.Horizon/Lbl/LblIpcServer.cs b/src/Ryujinx.Horizon/Lbl/LblIpcServer.cs new file mode 100644 index 00000000..53e74d51 --- /dev/null +++ b/src/Ryujinx.Horizon/Lbl/LblIpcServer.cs @@ -0,0 +1,43 @@ +using Ryujinx.Horizon.Lbl.Ipc; +using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Horizon.Sdk.Sm; + +namespace Ryujinx.Horizon.Lbl +{ + class LblIpcServer + { + private const int MaxSessionsCount = 5; + + private const int PointerBufferSize = 0; + private const int MaxDomains = 0; + private const int MaxDomainObjects = 0; + private const int MaxPortsCount = 1; + + private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + + private SmApi _sm; + private ServerManager _serverManager; + + public void Initialize() + { + HeapAllocator allocator = new(); + + _sm = new SmApi(); + _sm.Initialize().AbortOnFailure(); + + _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _managerOptions, MaxSessionsCount); + + _serverManager.RegisterObjectForServer(new LblController(), ServiceName.Encode("lbl"), MaxSessionsCount); + } + + public void ServiceRequests() + { + _serverManager.ServiceRequests(); + } + + public void Shutdown() + { + _serverManager.Dispose(); + } + } +} diff --git a/src/Ryujinx.Horizon/Lbl/LblMain.cs b/src/Ryujinx.Horizon/Lbl/LblMain.cs new file mode 100644 index 00000000..f471f31b --- /dev/null +++ b/src/Ryujinx.Horizon/Lbl/LblMain.cs @@ -0,0 +1,17 @@ +namespace Ryujinx.Horizon.Lbl +{ + class LblMain : IService + { + public static void Main(ServiceTable serviceTable) + { + LblIpcServer ipcServer = new(); + + ipcServer.Initialize(); + + serviceTable.SignalServiceReady(); + + ipcServer.ServiceRequests(); + ipcServer.Shutdown(); + } + } +} diff --git a/src/Ryujinx.Horizon/LogManager/LmIpcServer.cs b/src/Ryujinx.Horizon/LogManager/LmIpcServer.cs index d1a405b8..6bdc3c42 100644 --- a/src/Ryujinx.Horizon/LogManager/LmIpcServer.cs +++ b/src/Ryujinx.Horizon/LogManager/LmIpcServer.cs @@ -6,14 +6,14 @@ namespace Ryujinx.Horizon.LogManager { class LmIpcServer { - private const int LogMaxSessionsCount = 42; + private const int MaxSessionsCount = 42; private const int PointerBufferSize = 0x400; private const int MaxDomains = 31; private const int MaxDomainObjects = 61; private const int MaxPortsCount = 1; - private static readonly ManagerOptions _logManagerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); private SmApi _sm; private ServerManager _serverManager; @@ -25,9 +25,9 @@ namespace Ryujinx.Horizon.LogManager _sm = new SmApi(); _sm.Initialize().AbortOnFailure(); - _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _logManagerOptions, LogMaxSessionsCount); + _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _managerOptions, MaxSessionsCount); - _serverManager.RegisterObjectForServer(new LogService(), ServiceName.Encode("lm"), LogMaxSessionsCount); + _serverManager.RegisterObjectForServer(new LogService(), ServiceName.Encode("lm"), MaxSessionsCount); } public void ServiceRequests() diff --git a/src/Ryujinx.Horizon/MmNv/MmNvIpcServer.cs b/src/Ryujinx.Horizon/MmNv/MmNvIpcServer.cs index e60b2558..b6615d2c 100644 --- a/src/Ryujinx.Horizon/MmNv/MmNvIpcServer.cs +++ b/src/Ryujinx.Horizon/MmNv/MmNvIpcServer.cs @@ -6,14 +6,14 @@ namespace Ryujinx.Horizon.MmNv { class MmNvIpcServer { - private const int MmNvMaxSessionsCount = 9; + private const int MaxSessionsCount = 40; private const int PointerBufferSize = 0; private const int MaxDomains = 0; private const int MaxDomainObjects = 0; private const int MaxPortsCount = 1; - private static readonly ManagerOptions _mmNvOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); private SmApi _sm; private ServerManager _serverManager; @@ -25,9 +25,9 @@ namespace Ryujinx.Horizon.MmNv _sm = new SmApi(); _sm.Initialize().AbortOnFailure(); - _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _mmNvOptions, MmNvMaxSessionsCount); + _serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _managerOptions, MaxSessionsCount); - _serverManager.RegisterObjectForServer(new Request(), ServiceName.Encode("mm:u"), MmNvMaxSessionsCount); + _serverManager.RegisterObjectForServer(new Request(), ServiceName.Encode("mm:u"), MaxSessionsCount); } public void ServiceRequests() diff --git a/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs b/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs index 9c185520..410f997e 100644 --- a/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs +++ b/src/Ryujinx.Horizon/Prepo/PrepoIpcServer.cs @@ -6,15 +6,15 @@ namespace Ryujinx.Horizon.Prepo { class PrepoIpcServer { - private const int PrepoMaxSessionsCount = 12; - private const int PrepoTotalMaxSessionsCount = PrepoMaxSessionsCount * 6; + private const int MaxSessionsCount = 12; + private const int TotalMaxSessionsCount = MaxSessionsCount * 6; private const int PointerBufferSize = 0x80; private const int MaxDomains = 64; private const int MaxDomainObjects = 16; private const int MaxPortsCount = 6; - private static readonly ManagerOptions _prepoManagerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); + private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false); private SmApi _sm; private PrepoServerManager _serverManager; @@ -26,15 +26,15 @@ namespace Ryujinx.Horizon.Prepo _sm = new SmApi(); _sm.Initialize().AbortOnFailure(); - _serverManager = new PrepoServerManager(allocator, _sm, MaxPortsCount, _prepoManagerOptions, PrepoTotalMaxSessionsCount); + _serverManager = new PrepoServerManager(allocator, _sm, MaxPortsCount, _managerOptions, TotalMaxSessionsCount); #pragma warning disable IDE0055 // Disable formatting - _serverManager.RegisterServer((int)PrepoPortIndex.Admin, ServiceName.Encode("prepo:a"), PrepoMaxSessionsCount); // 1.0.0-5.1.0 - _serverManager.RegisterServer((int)PrepoPortIndex.Admin2, ServiceName.Encode("prepo:a2"), PrepoMaxSessionsCount); // 6.0.0+ - _serverManager.RegisterServer((int)PrepoPortIndex.Manager, ServiceName.Encode("prepo:m"), PrepoMaxSessionsCount); - _serverManager.RegisterServer((int)PrepoPortIndex.User, ServiceName.Encode("prepo:u"), PrepoMaxSessionsCount); - _serverManager.RegisterServer((int)PrepoPortIndex.System, ServiceName.Encode("prepo:s"), PrepoMaxSessionsCount); - _serverManager.RegisterServer((int)PrepoPortIndex.Debug, ServiceName.Encode("prepo:d"), PrepoMaxSessionsCount); // 1.0.0 + _serverManager.RegisterServer((int)PrepoPortIndex.Admin, ServiceName.Encode("prepo:a"), MaxSessionsCount); // 1.0.0-5.1.0 + _serverManager.RegisterServer((int)PrepoPortIndex.Admin2, ServiceName.Encode("prepo:a2"), MaxSessionsCount); // 6.0.0+ + _serverManager.RegisterServer((int)PrepoPortIndex.Manager, ServiceName.Encode("prepo:m"), MaxSessionsCount); + _serverManager.RegisterServer((int)PrepoPortIndex.User, ServiceName.Encode("prepo:u"), MaxSessionsCount); + _serverManager.RegisterServer((int)PrepoPortIndex.System, ServiceName.Encode("prepo:s"), MaxSessionsCount); + _serverManager.RegisterServer((int)PrepoPortIndex.Debug, ServiceName.Encode("prepo:d"), MaxSessionsCount); // 1.0.0 #pragma warning restore IDE0055 } diff --git a/src/Ryujinx.Horizon/Sdk/Lbl/ILblController.cs b/src/Ryujinx.Horizon/Sdk/Lbl/ILblController.cs new file mode 100644 index 00000000..594722e9 --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Lbl/ILblController.cs @@ -0,0 +1,20 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Sf; + +namespace Ryujinx.Horizon.Sdk.Lbl +{ + interface ILblController : IServiceObject + { + Result SetBrightnessReflectionDelayLevel(float unknown0, float unknown1); + Result GetBrightnessReflectionDelayLevel(out float unknown1, float unknown0); + Result SetCurrentBrightnessMapping(float unknown0, float unknown1, float unknown2); + Result GetCurrentBrightnessMapping(out float unknown0, out float unknown1, out float unknown2); + Result SetCurrentAmbientLightSensorMapping(float unknown0, float unknown1, float unknown2); + Result GetCurrentAmbientLightSensorMapping(out float unknown0, out float unknown1, out float unknown2); + Result SetCurrentBrightnessSettingForVrMode(float currentBrightnessSettingForVrMode); + Result GetCurrentBrightnessSettingForVrMode(out float currentBrightnessSettingForVrMode); + Result EnableVrMode(); + Result DisableVrMode(); + Result IsVrModeEnabled(out bool vrModeEnabled); + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs b/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs new file mode 100644 index 00000000..843a9acd --- /dev/null +++ b/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs @@ -0,0 +1,43 @@ +using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Sdk.Sm; +using System; + +namespace Ryujinx.Horizon.Sdk.Lbl +{ + public class LblApi : IDisposable + { + private const string LblName = "lbl"; + + private int _sessionHandle; + + public LblApi() + { + using var smApi = new SmApi(); + + smApi.Initialize(); + smApi.GetServiceHandle(out _sessionHandle, ServiceName.Encode(LblName)).AbortOnFailure(); + } + + public Result EnableVrMode() + { + return ServiceUtil.SendRequest(out _, _sessionHandle, 26, sendPid: false, ReadOnlySpan<byte>.Empty); + } + + public Result DisableVrMode() + { + return ServiceUtil.SendRequest(out _, _sessionHandle, 27, sendPid: false, ReadOnlySpan<byte>.Empty); + } + + public void Dispose() + { + if (_sessionHandle != 0) + { + HorizonStatic.Syscall.CloseHandle(_sessionHandle); + + _sessionHandle = 0; + } + + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs b/src/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs index f90d39c2..c89f118c 100644 --- a/src/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs +++ b/src/Ryujinx.Horizon/Sdk/Sm/ServiceName.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.Horizon.Sdk.Sm { [StructLayout(LayoutKind.Sequential, Pack = 1)] - readonly struct ServiceName + public readonly struct ServiceName { public static ServiceName Invalid { get; } = new(0); diff --git a/src/Ryujinx.Horizon/Sdk/Sm/SmApi.cs b/src/Ryujinx.Horizon/Sdk/Sm/SmApi.cs index 3e5635bf..1ab400bd 100644 --- a/src/Ryujinx.Horizon/Sdk/Sm/SmApi.cs +++ b/src/Ryujinx.Horizon/Sdk/Sm/SmApi.cs @@ -5,7 +5,7 @@ using System; namespace Ryujinx.Horizon.Sdk.Sm { - class SmApi + public class SmApi : IDisposable { private const string SmName = "sm:"; @@ -109,5 +109,17 @@ namespace Ryujinx.Horizon.Sdk.Sm return ServiceUtil.SendRequest(out _, _portHandle, 4, sendPid: true, data); } + + public void Dispose() + { + if (_portHandle != 0) + { + HorizonStatic.Syscall.CloseHandle(_portHandle); + + _portHandle = 0; + } + + GC.SuppressFinalize(this); + } } } diff --git a/src/Ryujinx.Horizon/ServiceTable.cs b/src/Ryujinx.Horizon/ServiceTable.cs index 8dfacbeb..cd443329 100644 --- a/src/Ryujinx.Horizon/ServiceTable.cs +++ b/src/Ryujinx.Horizon/ServiceTable.cs @@ -1,4 +1,5 @@ using Ryujinx.Horizon.Bcat; +using Ryujinx.Horizon.Lbl; using Ryujinx.Horizon.LogManager; using Ryujinx.Horizon.MmNv; using Ryujinx.Horizon.Prepo; @@ -23,10 +24,11 @@ namespace Ryujinx.Horizon entries.Add(new ServiceEntry(T.Main, this, options)); } - RegisterService<LmMain>(); - RegisterService<PrepoMain>(); RegisterService<BcatMain>(); + RegisterService<LblMain>(); + RegisterService<LmMain>(); RegisterService<MmNvMain>(); + RegisterService<PrepoMain>(); _totalServices = entries.Count; |