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_VRSESSION_H
8 #define GFX_VR_SERVICE_VRSESSION_H
9 
10 #include "moz_external_vr.h"
11 
12 #if defined(XP_WIN)
13 #  include <d3d11_1.h>
14 #elif defined(XP_MACOSX)
15 class MacIOSurface;
16 #endif
17 
18 namespace mozilla {
19 namespace gfx {
20 
21 class VRSession {
22  public:
23   VRSession();
24 
25   // Since this class doesn't use smartpointers for its refcounted
26   // members (so that it can compile outside of mozilla-central),
27   // prevent copying the addresses without increasing the refcount.
28   VRSession(const VRSession&) = delete;
29   VRSession& operator=(const VRSession&) = delete;
30 
31 #ifdef XP_WIN
32   virtual ~VRSession();
33 #else
34   virtual ~VRSession() = default;
35 #endif
36 
37   static void UpdateTrigger(VRControllerState& aState, uint32_t aButtonIndex,
38                             float aValue, float aThreshold);
39   /**
40    * In order to support WebXR's navigator.xr.IsSessionSupported call without
41    * displaying any permission dialogue, it is necessary to have a safe way to
42    * detect the capability of running a VR or AR session without activating XR
43    * runtimes or powering on hardware.
44    *
45    * API's such as OpenVR make no guarantee that hardware and software won't be
46    * left activated after enumerating devices, so each backend in gfx/vr/service
47    * must allow for more granular detection of capabilities.
48    *
49    * By passing true to bDetectRuntimesOnly, the initialization exits early
50    * after reporting the presence of XR runtime software. The Initialize method
51    * will only enumerate hardware and possibly return true when
52    * aDetectRuntimesOnly is false.
53    */
54   virtual bool Initialize(mozilla::gfx::VRSystemState& aSystemState,
55                           bool aDetectRuntimesOnly) = 0;
56   virtual void Shutdown() = 0;
57   virtual void ProcessEvents(mozilla::gfx::VRSystemState& aSystemState) = 0;
58   virtual void StartFrame(mozilla::gfx::VRSystemState& aSystemState) = 0;
59   virtual bool StartPresentation() = 0;
60   virtual void StopPresentation() = 0;
61   virtual void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
62                              float aIntensity, float aDuration) = 0;
63   virtual void StopVibrateHaptic(uint32_t aControllerIdx) = 0;
64   virtual void StopAllHaptics() = 0;
65   bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer);
66   bool ShouldQuit() const;
67 
68  protected:
69   bool mShouldQuit;
70 #if defined(XP_WIN)
71   virtual bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer,
72                            ID3D11Texture2D* aTexture) = 0;
73   bool CreateD3DContext(ID3D11Device* aDevice);
74 
75   ID3D11Device1* GetD3DDevice();
76   ID3D11DeviceContext1* GetD3DDeviceContext();
77   ID3DDeviceContextState* GetD3DDeviceContextState();
78 
79   ID3D11Device1* mDevice;
80   ID3D11DeviceContext1* mContext;
81   ID3DDeviceContextState* mDeviceContextState;
82 
83 #elif defined(XP_MACOSX)
84   virtual bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer,
85                            const VRLayerTextureHandle& aTexture) = 0;
86 #endif
87   void SetControllerSelectionAndSqueezeFrameId(
88       VRControllerState& controllerState, uint64_t aFrameId);
89 };
90 
91 }  // namespace gfx
92 }  // namespace mozilla
93 
94 #endif  // GFX_VR_SERVICE_VRSESSION_H
95