diff options
Diffstat (limited to 'dom/vr/VRServiceTest.h')
-rw-r--r-- | dom/vr/VRServiceTest.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/dom/vr/VRServiceTest.h b/dom/vr/VRServiceTest.h new file mode 100644 index 0000000000..b397108f6f --- /dev/null +++ b/dom/vr/VRServiceTest.h @@ -0,0 +1,206 @@ +/* -*- 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_VRServiceTest_h_ +#define mozilla_dom_VRServiceTest_h_ + +#include "mozilla/DOMEventTargetHelper.h" +#include "mozilla/dom/TypedArray.h" +#include "mozilla/dom/VRServiceTestBinding.h" + +#include "gfxVR.h" + +namespace mozilla { +namespace gfx { +enum class VRDisplayCapabilityFlags : uint16_t; +enum class VRPuppet_Command : uint64_t; +} // namespace gfx +namespace dom { +enum class GamepadCapabilityFlags : uint16_t; + +class VRMockDisplay final : public DOMEventTargetHelper { + public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VRMockDisplay, DOMEventTargetHelper) + + explicit VRMockDisplay(VRServiceTest* aVRServiceTest); + + void Create(); + void Clear(); + + void SetConnected(bool aConnected); + bool Connected() const; + void SetMounted(bool aMounted); + bool Mounted() const; + void SetCapPosition(bool aEnabled); + bool CapPosition() const; + void SetCapOrientation(bool aEnabled); + bool CapOrientation() const; + void SetCapPresent(bool aEnabled); + bool CapPresent() const; + void SetCapExternal(bool aEnabled); + bool CapExternal() const; + void SetCapAngularAcceleration(bool aEnabled); + bool CapAngularAcceleration() const; + void SetCapLinearAcceleration(bool aEnabled); + bool CapLinearAcceleration() const; + void SetCapStageParameters(bool aEnabled); + bool CapStageParameters() const; + void SetCapMountDetection(bool aEnabled); + bool CapMountDetection() const; + void SetCapPositionEmulated(bool aEnabled); + bool CapPositionEmulated() const; + void SetEyeFOV(VREye aEye, double aUpDegree, double aRightDegree, + double aDownDegree, double aLeftDegree); + void SetEyeOffset(VREye aEye, double aOffsetX, double aOffsetY, + double aOffsetZ); + void SetEyeResolution(uint32_t aRenderWidth, uint32_t aRenderHeight); + void SetStageSize(double aWidth, double aHeight); + void SetSittingToStandingTransform(const Float32Array& aTransform, + ErrorResult& aRv); + void SetPose(const Nullable<Float32Array>& aPosition, + const Nullable<Float32Array>& aLinearVelocity, + const Nullable<Float32Array>& aLinearAcceleration, + const Nullable<Float32Array>& aOrientation, + const Nullable<Float32Array>& aAngularVelocity, + const Nullable<Float32Array>& aAngularAcceleration, + ErrorResult& aRv); + virtual JSObject* WrapObject(JSContext* aCx, + JS::Handle<JSObject*> aGivenProto) override; + + private: + ~VRMockDisplay() = default; + gfx::VRDisplayState& DisplayState() const; + gfx::VRHMDSensorState& SensorState() const; + void SetCapFlag(gfx::VRDisplayCapabilityFlags aFlag, bool aEnabled); + bool GetCapFlag(gfx::VRDisplayCapabilityFlags aFlag) const; + + RefPtr<VRServiceTest> mVRServiceTest; +}; + +class VRMockController : public DOMEventTargetHelper { + public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VRMockController, + DOMEventTargetHelper) + + VRMockController(VRServiceTest* aVRServiceTest, uint32_t aControllerIdx); + void Create(); + void Clear(); + void SetHand(GamepadHand aHand); + GamepadHand Hand() const; + void SetCapPosition(bool aEnabled); + bool CapPosition() const; + void SetCapOrientation(bool aEnabled); + bool CapOrientation() const; + void SetCapAngularAcceleration(bool aEnabled); + bool CapAngularAcceleration() const; + void SetCapLinearAcceleration(bool aEnabled); + bool CapLinearAcceleration() const; + void SetAxisCount(uint32_t aCount); + uint32_t AxisCount() const; + void SetButtonCount(uint32_t aCount); + uint32_t ButtonCount() const; + void SetHapticCount(uint32_t aCount); + uint32_t HapticCount() const; + void SetButtonPressed(uint32_t aButtonIdx, bool aPressed); + void SetButtonTouched(uint32_t aButtonIdx, bool aTouched); + void SetButtonTrigger(uint32_t aButtonIdx, double aTrigger); + void SetAxisValue(uint32_t aAxisIdx, double aValue); + void SetPose(const Nullable<Float32Array>& aPosition, + const Nullable<Float32Array>& aLinearVelocity, + const Nullable<Float32Array>& aLinearAcceleration, + const Nullable<Float32Array>& aOrientation, + const Nullable<Float32Array>& aAngularVelocity, + const Nullable<Float32Array>& aAngularAcceleration, + ErrorResult& aRv); + + virtual JSObject* WrapObject(JSContext* aCx, + JS::Handle<JSObject*> aGivenProto) override; + + private: + ~VRMockController() = default; + gfx::VRControllerState& ControllerState() const; + void SetCapFlag(GamepadCapabilityFlags aFlag, bool aEnabled); + bool GetCapFlag(GamepadCapabilityFlags aFlag) const; + RefPtr<VRServiceTest> mVRServiceTest; + uint32_t mControllerIdx; +}; + +class VRServiceTest final : public DOMEventTargetHelper { + public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VRServiceTest, DOMEventTargetHelper) + + // WebIDL interface + + void ClearAll(); + void ClearController(uint32_t aControllerIdx); + void Commit(); + void End(); + already_AddRefed<Promise> Run(ErrorResult& aRv); + already_AddRefed<Promise> Reset(ErrorResult& aRv); + VRMockDisplay* GetVRDisplay(); + VRMockController* GetVRController(uint32_t aControllerIdx, ErrorResult& aRv); + void Timeout(uint32_t aDuration); + void Wait(uint32_t aDuration); + void WaitSubmit(); + void WaitPresentationStart(); + void WaitPresentationEnd(); + void WaitHapticIntensity(uint32_t aControllerIdx, uint32_t aHapticIdx, + double aIntensity, ErrorResult& aRv); + void CaptureFrame(); + void AcknowledgeFrame(); + void RejectFrame(); + void StartTimer(); + void StopTimer(); + + // Implementation + void Shutdown(); + void AddCommand(uint64_t aCommand); + static already_AddRefed<VRServiceTest> CreateTestService( + nsPIDOMWindowInner* aWindow); + virtual JSObject* WrapObject(JSContext* aCx, + JS::Handle<JSObject*> aGivenProto) override; + gfx::VRSystemState& SystemState(); + + private: + explicit VRServiceTest(nsPIDOMWindowInner* aWindow); + ~VRServiceTest() = default; + void EncodeData(); + + RefPtr<VRMockDisplay> mDisplay; + nsTArray<RefPtr<VRMockController>> mControllers; + nsCOMPtr<nsPIDOMWindowInner> mWindow; + // mPendingState records the state of the emulated VR hardware, including + // changes that have not yet been committed to the command buffer. + gfx::VRSystemState mPendingState; + // mEncodedState records the state of the emulate VR hardware at the end + // of the last committed transaction, submitted with VRServiceTest::Commit(). + // mPendingState represents the resulting state if all of the commands in + // mCommandBuffer have been played back. + gfx::VRSystemState mEncodedState; + // mCommandBuffer encodes a sequence of steps to be executed asynchronously by + // the simulated VR hardware. The steps are encoded as a stream of uint64's, + // using the format described in gfx/vr/VRPuppetCommandBuffer.h + // mCommandBuffer includes only complete transactions, which will be played + // back such that multiple values in VRSystemState will be updated atomically. + // When the command buffer is submitted to the PuppetSession, with + // VRServiceTest::Run(), it is cleared to ensure that the commands are not + // sent redundantly in subsequent VRServicetest::Run() calls. + // VRServiceTest::Commit() will perform a binary comparison of mPendingState + // and mEncodedState to determine what instructions need to be appended to + // mCommandBuffer. + // VRServiceTest::Reset() will effectively cancel all transactions and clear + // mCommandBuffer before submitting the reset request to the PuppetSession. + nsTArray<uint64_t> mCommandBuffer; + bool mShuttingDown; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_VRServiceTest_h_ |