1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef GFX_VR_SERVICE_OPENVRSESSION_H 8 #define GFX_VR_SERVICE_OPENVRSESSION_H 9 10 #include "VRSession.h" 11 12 #include "openvr.h" 13 #include "mozilla/TimeStamp.h" 14 #include "moz_external_vr.h" 15 #include "OpenVRControllerMapper.h" 16 17 #if defined(XP_WIN) 18 # include <d3d11_1.h> 19 #endif 20 class nsITimer; 21 22 namespace mozilla { 23 namespace gfx { 24 class VRThread; 25 class OpenVRControllerMapper; 26 27 static const int kNumOpenVRHaptics = 1; 28 29 enum OpenVRHand : int8_t { 30 Left = 0, 31 Right = 1, 32 Total = 2, 33 34 None = -1 35 }; 36 37 class OpenVRSession : public VRSession { 38 public: 39 OpenVRSession(); 40 virtual ~OpenVRSession(); 41 42 bool Initialize(mozilla::gfx::VRSystemState& aSystemState, 43 bool aDetectRuntimesOnly) override; 44 void Shutdown() override; 45 void ProcessEvents(mozilla::gfx::VRSystemState& aSystemState) override; 46 void StartFrame(mozilla::gfx::VRSystemState& aSystemState) override; 47 bool StartPresentation() override; 48 void StopPresentation() override; 49 void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex, 50 float aIntensity, float aDuration) override; 51 void StopVibrateHaptic(uint32_t aControllerIdx) override; 52 void StopAllHaptics() override; 53 54 protected: 55 #if defined(XP_WIN) 56 bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer, 57 ID3D11Texture2D* aTexture) override; 58 #elif defined(XP_MACOSX) 59 bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer, 60 const VRLayerTextureHandle& aTexture) override; 61 #endif 62 63 private: 64 // OpenVR State 65 ::vr::IVRSystem* mVRSystem = nullptr; 66 ::vr::IVRChaperone* mVRChaperone = nullptr; 67 ::vr::IVRCompositor* mVRCompositor = nullptr; 68 ::vr::VRActionSetHandle_t mActionsetFirefox = vr::k_ulInvalidActionSetHandle; 69 OpenVRHand mControllerDeviceIndex[kVRControllerMaxCount]; 70 ControllerInfo mControllerHand[OpenVRHand::Total]; 71 float mHapticPulseRemaining[kVRControllerMaxCount][kNumOpenVRHaptics]; 72 float mHapticPulseIntensity[kVRControllerMaxCount][kNumOpenVRHaptics]; 73 bool mIsWindowsMR; 74 TimeStamp mLastHapticUpdate; 75 76 static void HapticTimerCallback(nsITimer* aTimer, void* aClosure); 77 bool InitState(mozilla::gfx::VRSystemState& aSystemState); 78 void UpdateStageParameters(mozilla::gfx::VRDisplayState& aState); 79 void UpdateEyeParameters(mozilla::gfx::VRSystemState& aState); 80 void UpdateHeadsetPose(mozilla::gfx::VRSystemState& aState); 81 void EnumerateControllers(VRSystemState& aState); 82 void UpdateControllerPoses(VRSystemState& aState); 83 void UpdateControllerButtons(VRSystemState& aState); 84 void UpdateTelemetry(VRSystemState& aSystemState); 85 bool SetupContollerActions(); 86 87 bool SubmitFrame(const VRLayerTextureHandle& aTextureHandle, 88 ::vr::ETextureType aTextureType, 89 const VRLayerEyeRect& aLeftEyeRect, 90 const VRLayerEyeRect& aRightEyeRect); 91 #if defined(XP_WIN) 92 bool CreateD3DObjects(); 93 #endif 94 void GetControllerDeviceId(::vr::ETrackedDeviceClass aDeviceType, 95 ::vr::TrackedDeviceIndex_t aDeviceIndex, 96 nsCString& aId, 97 mozilla::gfx::VRControllerType& aControllerType); 98 void UpdateHaptics(); 99 void StartHapticThread(); 100 void StopHapticThread(); 101 void StartHapticTimer(); 102 void StopHapticTimer(); 103 RefPtr<nsITimer> mHapticTimer; 104 RefPtr<VRThread> mHapticThread; 105 mozilla::Mutex mControllerHapticStateMutex; 106 UniquePtr<OpenVRControllerMapper> mControllerMapper; 107 }; 108 109 } // namespace gfx 110 } // namespace mozilla 111 112 #endif // GFX_VR_SERVICE_OPENVRSESSION_H 113