summaryrefslogtreecommitdiffstats
path: root/dom/vr/XRSession.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /dom/vr/XRSession.h
parentInitial commit. (diff)
downloadfirefox-e51783d008170d9ab27d25da98ca3a38b0a41b67.tar.xz
firefox-e51783d008170d9ab27d25da98ca3a38b0a41b67.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/vr/XRSession.h')
-rw-r--r--dom/vr/XRSession.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/dom/vr/XRSession.h b/dom/vr/XRSession.h
new file mode 100644
index 0000000000..9215058a1b
--- /dev/null
+++ b/dom/vr/XRSession.h
@@ -0,0 +1,159 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_XRSession_h_
+#define mozilla_dom_XRSession_h_
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/WebXRBinding.h"
+#include "nsRefreshObservers.h"
+
+#include "gfxVR.h"
+
+class nsRefreshDriver;
+
+namespace mozilla {
+namespace gfx {
+class VRDisplayClient;
+class VRDisplayPresentation;
+} // namespace gfx
+namespace dom {
+
+class XRSystem;
+enum class XREye : uint8_t;
+enum class XRReferenceSpaceType : uint8_t;
+enum class XRSessionMode : uint8_t;
+enum class XRVisibilityState : uint8_t;
+class XRFrame;
+class XRFrameRequestCallback;
+class XRInputSource;
+class XRInputSourceArray;
+class XRLayer;
+struct XRReferenceSpaceOptions;
+class XRRenderState;
+struct XRRenderStateInit;
+class XRSpace;
+class XRViewerPose;
+
+class XRSession final : public DOMEventTargetHelper, public nsARefreshObserver {
+ public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XRSession, DOMEventTargetHelper)
+
+ private:
+ explicit XRSession(
+ nsPIDOMWindowInner* aWindow, XRSystem* aXRSystem,
+ nsRefreshDriver* aRefreshDriver, gfx::VRDisplayClient* aClient,
+ uint32_t aPresentationGroup,
+ const nsTArray<XRReferenceSpaceType>& aEnabledReferenceSpaceTypes);
+
+ public:
+ static already_AddRefed<XRSession> CreateInlineSession(
+ nsPIDOMWindowInner* aWindow, XRSystem* aXRSystem,
+ const nsTArray<XRReferenceSpaceType>& aEnabledReferenceSpaceTypes);
+ static already_AddRefed<XRSession> CreateImmersiveSession(
+ nsPIDOMWindowInner* aWindow, XRSystem* aXRSystem,
+ gfx::VRDisplayClient* aClient, uint32_t aPresentationGroup,
+ const nsTArray<XRReferenceSpaceType>& aEnabledReferenceSpaceTypes);
+
+ // WebIDL Boilerplate
+ JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL Attributes
+ XRVisibilityState VisibilityState() const;
+ XRRenderState* RenderState();
+ XRInputSourceArray* InputSources();
+ Nullable<float> GetFrameRate();
+ void GetSupportedFrameRates(JSContext* aJSContext,
+ JS::MutableHandle<JSObject*> aRetval);
+
+ // WebIDL Methods
+ void UpdateRenderState(const XRRenderStateInit& aNewState, ErrorResult& aRv);
+ already_AddRefed<Promise> RequestReferenceSpace(
+ const XRReferenceSpaceType& aReferenceSpaceType, ErrorResult& aRv);
+ int32_t RequestAnimationFrame(XRFrameRequestCallback& aCallback,
+ mozilla::ErrorResult& aError);
+ void CancelAnimationFrame(int32_t aHandle, mozilla::ErrorResult& aError);
+ already_AddRefed<Promise> End(ErrorResult& aRv);
+ already_AddRefed<Promise> UpdateTargetFrameRate(float aRate,
+ ErrorResult& aRv);
+
+ // WebIDL Events
+ IMPL_EVENT_HANDLER(end);
+ IMPL_EVENT_HANDLER(inputsourceschange);
+ IMPL_EVENT_HANDLER(select);
+ IMPL_EVENT_HANDLER(selectstart);
+ IMPL_EVENT_HANDLER(selectend);
+ IMPL_EVENT_HANDLER(squeeze);
+ IMPL_EVENT_HANDLER(squeezestart);
+ IMPL_EVENT_HANDLER(squeezeend);
+ IMPL_EVENT_HANDLER(visibilitychange);
+
+ // Non WebIDL Members
+ gfx::VRDisplayClient* GetDisplayClient() const;
+ XRRenderState* GetActiveRenderState() const;
+ bool IsEnded() const;
+ bool IsImmersive() const;
+ MOZ_CAN_RUN_SCRIPT
+ void StartFrame();
+ void ExitPresent();
+ RefPtr<XRViewerPose> PooledViewerPose(const gfx::Matrix4x4Double& aTransform,
+ bool aEmulatedPosition);
+ bool CanReportPoses() const;
+
+ // nsARefreshObserver
+ MOZ_CAN_RUN_SCRIPT
+ void WillRefresh(mozilla::TimeStamp aTime) override;
+
+ protected:
+ virtual ~XRSession();
+ void LastRelease() override;
+ void DisconnectFromOwner() override;
+ void Shutdown();
+ void ExitPresentInternal();
+ void ApplyPendingRenderState();
+ RefPtr<XRFrame> PooledFrame();
+ RefPtr<XRSystem> mXRSystem;
+ bool mShutdown;
+ bool mEnded;
+ RefPtr<nsRefreshDriver> mRefreshDriver;
+ RefPtr<gfx::VRDisplayClient> mDisplayClient;
+ RefPtr<gfx::VRDisplayPresentation> mDisplayPresentation;
+ RefPtr<XRRenderState> mActiveRenderState;
+ RefPtr<XRRenderState> mPendingRenderState;
+ RefPtr<XRInputSourceArray> mInputSources;
+
+ struct XRFrameRequest {
+ XRFrameRequest(mozilla::dom::XRFrameRequestCallback& aCallback,
+ int32_t aHandle)
+ : mCallback(&aCallback), mHandle(aHandle) {}
+ MOZ_CAN_RUN_SCRIPT
+ void Call(const DOMHighResTimeStamp& aTimeStamp, XRFrame& aFrame);
+
+ // Comparator operators to allow RemoveElementSorted with an
+ // integer argument on arrays of XRFrameRequest
+ bool operator==(int32_t aHandle) const { return mHandle == aHandle; }
+ bool operator<(int32_t aHandle) const { return mHandle < aHandle; }
+
+ RefPtr<mozilla::dom::XRFrameRequestCallback> mCallback;
+ int32_t mHandle;
+ };
+
+ int32_t mFrameRequestCallbackCounter;
+ nsTArray<XRFrameRequest> mFrameRequestCallbacks;
+ mozilla::TimeStamp mStartTimeStamp;
+ nsTArray<XRReferenceSpaceType> mEnabledReferenceSpaceTypes;
+ nsTArray<RefPtr<XRViewerPose>> mViewerPosePool;
+ uint32_t mViewerPosePoolIndex;
+ nsTArray<RefPtr<XRFrame>> mFramePool;
+ uint32_t mFramePoolIndex;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_XRSession_h_