Add support for dynamic docking/undocking (#1147)

* Add support for dynamic docking/undocking

As SurfaceFlinger is now working more accurately, we can now support
dynamic configuration of docking mode :)

* Simplify a bt the code

* Fix import ordering

* Remove unused argument
This commit is contained in:
Thog 2020-04-23 13:59:11 +02:00 committed by GitHub
parent 21a0b0ebeb
commit cdbb689b80
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 11 deletions

View file

@ -7,6 +7,7 @@ using LibHac.FsSystem.NcaUtils;
using LibHac.Ncm; using LibHac.Ncm;
using LibHac.Ns; using LibHac.Ns;
using LibHac.Spl; using LibHac.Spl;
using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Configuration; using Ryujinx.Configuration;
@ -16,7 +17,9 @@ using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Process;
using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy;
using Ryujinx.HLE.HOS.Services.Mii; using Ryujinx.HLE.HOS.Services.Mii;
using Ryujinx.HLE.HOS.Services.Nv;
using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl;
using Ryujinx.HLE.HOS.Services.Pcv.Bpc; using Ryujinx.HLE.HOS.Services.Pcv.Bpc;
using Ryujinx.HLE.HOS.Services.Settings; using Ryujinx.HLE.HOS.Services.Settings;
@ -41,7 +44,6 @@ using TimeServiceManager = Ryujinx.HLE.HOS.Services.Time.TimeManager;
using NsoExecutable = Ryujinx.HLE.Loaders.Executables.NsoExecutable; using NsoExecutable = Ryujinx.HLE.Loaders.Executables.NsoExecutable;
using static LibHac.Fs.ApplicationSaveDataManagement; using static LibHac.Fs.ApplicationSaveDataManagement;
using Ryujinx.HLE.HOS.Services.Nv;
namespace Ryujinx.HLE.HOS namespace Ryujinx.HLE.HOS
{ {
@ -114,6 +116,8 @@ namespace Ryujinx.HLE.HOS
internal KEvent VsyncEvent { get; private set; } internal KEvent VsyncEvent { get; private set; }
internal KEvent DisplayResolutionChangeEvent { get; private set; }
public Keyset KeySet => Device.FileSystem.KeySet; public Keyset KeySet => Device.FileSystem.KeySet;
#pragma warning disable CS0649 #pragma warning disable CS0649
@ -224,6 +228,8 @@ namespace Ryujinx.HLE.HOS
VsyncEvent = new KEvent(this); VsyncEvent = new KEvent(this);
DisplayResolutionChangeEvent = new KEvent(this);
ContentManager = contentManager; ContentManager = contentManager;
// TODO: use set:sys (and get external clock source id from settings) // TODO: use set:sys (and get external clock source id from settings)
@ -272,6 +278,20 @@ namespace Ryujinx.HLE.HOS
HostSyncpoint = new NvHostSyncpt(device); HostSyncpoint = new NvHostSyncpt(device);
SurfaceFlinger = new SurfaceFlinger(device); SurfaceFlinger = new SurfaceFlinger(device);
ConfigurationState.Instance.System.EnableDockedMode.Event += OnDockedModeChange;
}
private void OnDockedModeChange(object sender, ReactiveEventArgs<bool> e)
{
if (e.NewValue != State.DockedMode)
{
State.DockedMode = e.NewValue;
AppletState.EnqueueMessage(MessageInfo.OperationModeChanged);
AppletState.EnqueueMessage(MessageInfo.PerformanceModeChanged);
SignalDisplayResolutionChange();
}
} }
public void LoadCart(string exeFsDir, string romFsFile = null) public void LoadCart(string exeFsDir, string romFsFile = null)
@ -807,6 +827,11 @@ namespace Ryujinx.HLE.HOS
return rc; return rc;
} }
public void SignalDisplayResolutionChange()
{
DisplayResolutionChangeEvent.ReadableEvent.Signal();
}
public void SignalVsync() public void SignalVsync()
{ {
VsyncEvent.ReadableEvent.Signal(); VsyncEvent.ReadableEvent.Signal();
@ -852,6 +877,8 @@ namespace Ryujinx.HLE.HOS
{ {
if (!_isDisposed && disposing) if (!_isDisposed && disposing)
{ {
ConfigurationState.Instance.System.EnableDockedMode.Event -= OnDockedModeChange;
_isDisposed = true; _isDisposed = true;
SurfaceFlinger.Dispose(); SurfaceFlinger.Dispose();

View file

@ -10,7 +10,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
// GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter> // GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter>
public ResultCode GetCommonStateGetter(ServiceCtx context) public ResultCode GetCommonStateGetter(ServiceCtx context)
{ {
MakeObject(context, new ICommonStateGetter(context.Device.System)); MakeObject(context, new ICommonStateGetter());
return ResultCode.Success; return ResultCode.Success;
} }

View file

@ -9,14 +9,9 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
{ {
class ICommonStateGetter : IpcService class ICommonStateGetter : IpcService
{ {
private KEvent _displayResolutionChangeEvent;
private CpuBoostMode _cpuBoostMode = CpuBoostMode.Disabled; private CpuBoostMode _cpuBoostMode = CpuBoostMode.Disabled;
public ICommonStateGetter(Horizon system) public ICommonStateGetter() { }
{
_displayResolutionChangeEvent = new KEvent(system);
}
[Command(0)] [Command(0)]
// GetEventHandle() -> handle<copy> // GetEventHandle() -> handle<copy>
@ -108,7 +103,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
// GetDefaultDisplayResolutionChangeEvent() -> handle<copy> // GetDefaultDisplayResolutionChangeEvent() -> handle<copy>
public ResultCode GetDefaultDisplayResolutionChangeEvent(ServiceCtx context) public ResultCode GetDefaultDisplayResolutionChangeEvent(ServiceCtx context)
{ {
if (context.Process.HandleTable.GenerateHandle(_displayResolutionChangeEvent.ReadableEvent, out int handle) != KernelResult.Success) if (context.Process.HandleTable.GenerateHandle(context.Device.System.DisplayResolutionChangeEvent.ReadableEvent, out int handle) != KernelResult.Success)
{ {
throw new InvalidOperationException("Out of handles!"); throw new InvalidOperationException("Out of handles!");
} }

View file

@ -11,7 +11,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService
// GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter> // GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter>
public ResultCode GetCommonStateGetter(ServiceCtx context) public ResultCode GetCommonStateGetter(ServiceCtx context)
{ {
MakeObject(context, new ICommonStateGetter(context.Device.System)); MakeObject(context, new ICommonStateGetter());
return ResultCode.Success; return ResultCode.Success;
} }

View file

@ -68,7 +68,6 @@ namespace Ryujinx.HLE
EnableDeviceVsync = ConfigurationState.Instance.Graphics.EnableVsync; EnableDeviceVsync = ConfigurationState.Instance.Graphics.EnableVsync;
// TODO: Make this reloadable and implement Docking/Undocking logic.
System.State.DockedMode = ConfigurationState.Instance.System.EnableDockedMode; System.State.DockedMode = ConfigurationState.Instance.System.EnableDockedMode;
if (ConfigurationState.Instance.System.EnableMulticoreScheduling) if (ConfigurationState.Instance.System.EnableMulticoreScheduling)