Bug 1879816: Make nsCocoaWindow::Destroy close the window and let destruction happen...
[gecko.git] / dom / vr / XRSession.h
blob9215058a1baba66b1995254acf81dce8325f2c61
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"
14 #include "gfxVR.h"
16 class nsRefreshDriver;
18 namespace mozilla {
19 namespace gfx {
20 class VRDisplayClient;
21 class VRDisplayPresentation;
22 } // namespace gfx
23 namespace dom {
25 class XRSystem;
26 enum class XREye : uint8_t;
27 enum class XRReferenceSpaceType : uint8_t;
28 enum class XRSessionMode : uint8_t;
29 enum class XRVisibilityState : uint8_t;
30 class XRFrame;
31 class XRFrameRequestCallback;
32 class XRInputSource;
33 class XRInputSourceArray;
34 class XRLayer;
35 struct XRReferenceSpaceOptions;
36 class XRRenderState;
37 struct XRRenderStateInit;
38 class XRSpace;
39 class XRViewerPose;
41 class XRSession final : public DOMEventTargetHelper, public nsARefreshObserver {
42 public:
43 NS_DECL_ISUPPORTS_INHERITED
44 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XRSession, DOMEventTargetHelper)
46 private:
47 explicit XRSession(
48 nsPIDOMWindowInner* aWindow, XRSystem* aXRSystem,
49 nsRefreshDriver* aRefreshDriver, gfx::VRDisplayClient* aClient,
50 uint32_t aPresentationGroup,
51 const nsTArray<XRReferenceSpaceType>& aEnabledReferenceSpaceTypes);
53 public:
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);
62 // WebIDL Boilerplate
63 JSObject* WrapObject(JSContext* aCx,
64 JS::Handle<JSObject*> aGivenProto) override;
66 // WebIDL Attributes
67 XRVisibilityState VisibilityState() const;
68 XRRenderState* RenderState();
69 XRInputSourceArray* InputSources();
70 Nullable<float> GetFrameRate();
71 void GetSupportedFrameRates(JSContext* aJSContext,
72 JS::MutableHandle<JSObject*> aRetval);
74 // WebIDL Methods
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,
83 ErrorResult& aRv);
85 // WebIDL Events
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);
96 // Non WebIDL Members
97 gfx::VRDisplayClient* GetDisplayClient() const;
98 XRRenderState* GetActiveRenderState() const;
99 bool IsEnded() const;
100 bool IsImmersive() const;
101 MOZ_CAN_RUN_SCRIPT
102 void StartFrame();
103 void ExitPresent();
104 RefPtr<XRViewerPose> PooledViewerPose(const gfx::Matrix4x4Double& aTransform,
105 bool aEmulatedPosition);
106 bool CanReportPoses() const;
108 // nsARefreshObserver
109 MOZ_CAN_RUN_SCRIPT
110 void WillRefresh(mozilla::TimeStamp aTime) override;
112 protected:
113 virtual ~XRSession();
114 void LastRelease() override;
115 void DisconnectFromOwner() override;
116 void Shutdown();
117 void ExitPresentInternal();
118 void ApplyPendingRenderState();
119 RefPtr<XRFrame> PooledFrame();
120 RefPtr<XRSystem> mXRSystem;
121 bool mShutdown;
122 bool mEnded;
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,
132 int32_t aHandle)
133 : mCallback(&aCallback), mHandle(aHandle) {}
134 MOZ_CAN_RUN_SCRIPT
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;
143 int32_t mHandle;
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;
156 } // namespace dom
157 } // namespace mozilla
159 #endif // mozilla_dom_XRSession_h_