diff options
| author | Ac_K <Acoustik666@gmail.com> | 2020-11-15 22:30:20 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-15 22:30:20 +0100 |
| commit | 313f8d2eb6e4833170d685d6afd940c077e066f6 (patch) | |
| tree | e5840f885fa0a7c83244806e11103748b6c928c0 /Ryujinx.HLE/HOS/Services/Lbl | |
| parent | 4bc4cacdd0b615553a11cdcdb2aa7d3b563eac0b (diff) | |
am/lbl/hid/pctl: Enabled VR Rendering (#1688)
* am/lbl/hid/pctl: Enabled VR Rendering
This PR enable VR rendering on games which support it through the Toy-Con VR Goggles.
Please remember Ryujinx currently don't support console SixAxis sensor and for now, in some games, the view can't be moved.
Everything is implemented accordingly to RE:
- am: ICommonStateGetter: SetVrModeEnabled, BeginVrModeEx, EndVrModeEx.
- lbl: ILblController: SetBrightnessReflectionDelayLevel, GetBrightnessReflectionDelayLevel, SetCurrentAmbientLightSensorMapping, GetCurrentAmbientLightSensorMapping, SetCurrentBrightnessSettingForVrMode, GetCurrentBrightnessSettingForVrMode, EnableVrMode, DisableVrMode, IsVrModeEnabled.
- pctl: IParentalControlService: ConfirmStereoVisionPermission, ConfirmStereoVisionRestrictionConfigurable, GetStereoVisionRestriction, SetStereoVisionRestriction, ResetConfirmedStereoVisionPermission, IsStereoVisionPermitted.
- hid: IHidServer: ResetSevenSixAxisSensorTimestamp is stubbed because we don't support console SixAxisSensor for now.
Maybe we could add a setting later to enable or disable VR. But I think it's fine to keep this always available since you have to enable it in games.
* Fix permission flag check
* Address gdkchan feedback
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Lbl')
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Lbl/ILblController.cs | 88 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Lbl/LblControllerServer.cs | 54 |
2 files changed, 140 insertions, 2 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Lbl/ILblController.cs b/Ryujinx.HLE/HOS/Services/Lbl/ILblController.cs index de84095e..6964de6b 100644 --- a/Ryujinx.HLE/HOS/Services/Lbl/ILblController.cs +++ b/Ryujinx.HLE/HOS/Services/Lbl/ILblController.cs @@ -1,8 +1,92 @@ namespace Ryujinx.HLE.HOS.Services.Lbl { - [Service("lbl")] - class ILblController : IpcService + abstract class ILblController : IpcService { public ILblController(ServiceCtx context) { } + + protected abstract void SetCurrentBrightnessSettingForVrMode(float currentBrightnessSettingForVrMode); + protected abstract float GetCurrentBrightnessSettingForVrMode(); + internal abstract void EnableVrMode(); + internal abstract void DisableVrMode(); + protected abstract bool IsVrModeEnabled(); + + [Command(17)] + // SetBrightnessReflectionDelayLevel(float, float) + public ResultCode SetBrightnessReflectionDelayLevel(ServiceCtx context) + { + return ResultCode.Success; + } + + [Command(18)] + // GetBrightnessReflectionDelayLevel(float) -> float + public ResultCode GetBrightnessReflectionDelayLevel(ServiceCtx context) + { + context.ResponseData.Write(0.0f); + + return ResultCode.Success; + } + + [Command(21)] + // SetCurrentAmbientLightSensorMapping(unknown<0xC>) + public ResultCode SetCurrentAmbientLightSensorMapping(ServiceCtx context) + { + return ResultCode.Success; + } + + [Command(22)] + // GetCurrentAmbientLightSensorMapping() -> unknown<0xC> + public ResultCode GetCurrentAmbientLightSensorMapping(ServiceCtx context) + { + return ResultCode.Success; + } + + [Command(24)] // 3.0.0+ + // SetCurrentBrightnessSettingForVrMode(float) + public ResultCode SetCurrentBrightnessSettingForVrMode(ServiceCtx context) + { + float currentBrightnessSettingForVrMode = context.RequestData.ReadSingle(); + + SetCurrentBrightnessSettingForVrMode(currentBrightnessSettingForVrMode); + + return ResultCode.Success; + } + + [Command(25)] // 3.0.0+ + // GetCurrentBrightnessSettingForVrMode() -> float + public ResultCode GetCurrentBrightnessSettingForVrMode(ServiceCtx context) + { + float currentBrightnessSettingForVrMode = GetCurrentBrightnessSettingForVrMode(); + + context.ResponseData.Write(currentBrightnessSettingForVrMode); + + return ResultCode.Success; + } + + [Command(26)] // 3.0.0+ + // EnableVrMode() + public ResultCode EnableVrMode(ServiceCtx context) + { + EnableVrMode(); + + return ResultCode.Success; + } + + [Command(27)] // 3.0.0+ + // DisableVrMode() + public ResultCode DisableVrMode(ServiceCtx context) + { + DisableVrMode(); + + return ResultCode.Success; + } + + [Command(28)] // 3.0.0+ + // IsVrModeEnabled() -> bool + public ResultCode IsVrModeEnabled(ServiceCtx context) + { + context.ResponseData.Write(IsVrModeEnabled()); + + return ResultCode.Success; + } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Lbl/LblControllerServer.cs b/Ryujinx.HLE/HOS/Services/Lbl/LblControllerServer.cs new file mode 100644 index 00000000..b68be1f2 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lbl/LblControllerServer.cs @@ -0,0 +1,54 @@ +namespace Ryujinx.HLE.HOS.Services.Lbl +{ + [Service("lbl")] + class LblControllerServer : ILblController + { + private bool _vrModeEnabled; + private float _currentBrightnessSettingForVrMode; + + public LblControllerServer(ServiceCtx context) : base(context) { } + + protected override void SetCurrentBrightnessSettingForVrMode(float currentBrightnessSettingForVrMode) + { + if (float.IsNaN(currentBrightnessSettingForVrMode) || float.IsInfinity(currentBrightnessSettingForVrMode)) + { + _currentBrightnessSettingForVrMode = 0.0f; + + return; + } + + _currentBrightnessSettingForVrMode = currentBrightnessSettingForVrMode; + } + + protected override float GetCurrentBrightnessSettingForVrMode() + { + if (float.IsNaN(_currentBrightnessSettingForVrMode) || float.IsInfinity(_currentBrightnessSettingForVrMode)) + { + return 0.0f; + } + + return _currentBrightnessSettingForVrMode; + } + + internal override void EnableVrMode() + { + _vrModeEnabled = true; + + // NOTE: Service check _vrModeEnabled field value in a thread and then change the screen brightness. + // Since we don't support that. It's fine to do nothing. + } + + internal override void DisableVrMode() + { + _vrModeEnabled = false; + + // NOTE: Service check _vrModeEnabled field value in a thread and then change the screen brightness. + // Since we don't support that. It's fine to do nothing. + } + + protected override bool IsVrModeEnabled() + { + return _vrModeEnabled; + } + } +} |
