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 file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_dom_XRSession_h_
8 #define mozilla_dom_XRSession_h_
10 #include "mozilla/DOMEventTargetHelper.h"
11 #include "mozilla/dom/WebXRBinding.h"
12 #include "nsRefreshObservers.h"
16 class nsRefreshDriver
;
20 class VRDisplayClient
;
21 class VRDisplayPresentation
;
26 enum class XREye
: uint8_t;
27 enum class XRReferenceSpaceType
: uint8_t;
28 enum class XRSessionMode
: uint8_t;
29 enum class XRVisibilityState
: uint8_t;
31 class XRFrameRequestCallback
;
33 class XRInputSourceArray
;
35 struct XRReferenceSpaceOptions
;
37 struct XRRenderStateInit
;
41 class XRSession final
: public DOMEventTargetHelper
, public nsARefreshObserver
{
43 NS_DECL_ISUPPORTS_INHERITED
44 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XRSession
, DOMEventTargetHelper
)
48 nsPIDOMWindowInner
* aWindow
, XRSystem
* aXRSystem
,
49 nsRefreshDriver
* aRefreshDriver
, gfx::VRDisplayClient
* aClient
,
50 uint32_t aPresentationGroup
,
51 const nsTArray
<XRReferenceSpaceType
>& aEnabledReferenceSpaceTypes
);
54 static already_AddRefed
<XRSession
> CreateInlineSession(
55 nsPIDOMWindowInner
* aWindow
, XRSystem
* aXRSystem
,
56 const nsTArray
<XRReferenceSpaceType
>& aEnabledReferenceSpaceTypes
);
57 static already_AddRefed
<XRSession
> CreateImmersiveSession(
58 nsPIDOMWindowInner
* aWindow
, XRSystem
* aXRSystem
,
59 gfx::VRDisplayClient
* aClient
, uint32_t aPresentationGroup
,
60 const nsTArray
<XRReferenceSpaceType
>& aEnabledReferenceSpaceTypes
);
63 JSObject
* WrapObject(JSContext
* aCx
,
64 JS::Handle
<JSObject
*> aGivenProto
) override
;
67 XRVisibilityState
VisibilityState() const;
68 XRRenderState
* RenderState();
69 XRInputSourceArray
* InputSources();
70 Nullable
<float> GetFrameRate();
71 void GetSupportedFrameRates(JSContext
* aJSContext
,
72 JS::MutableHandle
<JSObject
*> aRetval
);
75 void UpdateRenderState(const XRRenderStateInit
& aNewState
, ErrorResult
& aRv
);
76 already_AddRefed
<Promise
> RequestReferenceSpace(
77 const XRReferenceSpaceType
& aReferenceSpaceType
, ErrorResult
& aRv
);
78 int32_t RequestAnimationFrame(XRFrameRequestCallback
& aCallback
,
79 mozilla::ErrorResult
& aError
);
80 void CancelAnimationFrame(int32_t aHandle
, mozilla::ErrorResult
& aError
);
81 already_AddRefed
<Promise
> End(ErrorResult
& aRv
);
82 already_AddRefed
<Promise
> UpdateTargetFrameRate(float aRate
,
86 IMPL_EVENT_HANDLER(end
);
87 IMPL_EVENT_HANDLER(inputsourceschange
);
88 IMPL_EVENT_HANDLER(select
);
89 IMPL_EVENT_HANDLER(selectstart
);
90 IMPL_EVENT_HANDLER(selectend
);
91 IMPL_EVENT_HANDLER(squeeze
);
92 IMPL_EVENT_HANDLER(squeezestart
);
93 IMPL_EVENT_HANDLER(squeezeend
);
94 IMPL_EVENT_HANDLER(visibilitychange
);
97 gfx::VRDisplayClient
* GetDisplayClient() const;
98 XRRenderState
* GetActiveRenderState() const;
100 bool IsImmersive() const;
104 RefPtr
<XRViewerPose
> PooledViewerPose(const gfx::Matrix4x4Double
& aTransform
,
105 bool aEmulatedPosition
);
106 bool CanReportPoses() const;
108 // nsARefreshObserver
110 void WillRefresh(mozilla::TimeStamp aTime
) override
;
113 virtual ~XRSession();
114 void LastRelease() override
;
115 void DisconnectFromOwner() override
;
117 void ExitPresentInternal();
118 void ApplyPendingRenderState();
119 RefPtr
<XRFrame
> PooledFrame();
120 RefPtr
<XRSystem
> mXRSystem
;
123 RefPtr
<nsRefreshDriver
> mRefreshDriver
;
124 RefPtr
<gfx::VRDisplayClient
> mDisplayClient
;
125 RefPtr
<gfx::VRDisplayPresentation
> mDisplayPresentation
;
126 RefPtr
<XRRenderState
> mActiveRenderState
;
127 RefPtr
<XRRenderState
> mPendingRenderState
;
128 RefPtr
<XRInputSourceArray
> mInputSources
;
130 struct XRFrameRequest
{
131 XRFrameRequest(mozilla::dom::XRFrameRequestCallback
& aCallback
,
133 : mCallback(&aCallback
), mHandle(aHandle
) {}
135 void Call(const DOMHighResTimeStamp
& aTimeStamp
, XRFrame
& aFrame
);
137 // Comparator operators to allow RemoveElementSorted with an
138 // integer argument on arrays of XRFrameRequest
139 bool operator==(int32_t aHandle
) const { return mHandle
== aHandle
; }
140 bool operator<(int32_t aHandle
) const { return mHandle
< aHandle
; }
142 RefPtr
<mozilla::dom::XRFrameRequestCallback
> mCallback
;
146 int32_t mFrameRequestCallbackCounter
;
147 nsTArray
<XRFrameRequest
> mFrameRequestCallbacks
;
148 mozilla::TimeStamp mStartTimeStamp
;
149 nsTArray
<XRReferenceSpaceType
> mEnabledReferenceSpaceTypes
;
150 nsTArray
<RefPtr
<XRViewerPose
>> mViewerPosePool
;
151 uint32_t mViewerPosePoolIndex
;
152 nsTArray
<RefPtr
<XRFrame
>> mFramePool
;
153 uint32_t mFramePoolIndex
;
157 } // namespace mozilla
159 #endif // mozilla_dom_XRSession_h_