diff options
Diffstat (limited to 'gfx/vr/VRDisplayHost.h')
-rw-r--r-- | gfx/vr/VRDisplayHost.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/gfx/vr/VRDisplayHost.h b/gfx/vr/VRDisplayHost.h new file mode 100644 index 000000000..0e04e4fd2 --- /dev/null +++ b/gfx/vr/VRDisplayHost.h @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- +* 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 GFX_VR_DISPLAY_HOST_H +#define GFX_VR_DISPLAY_HOST_H + +#include "gfxVR.h" +#include "nsTArray.h" +#include "nsString.h" +#include "nsCOMPtr.h" +#include "mozilla/RefPtr.h" +#include "mozilla/gfx/2D.h" +#include "mozilla/Atomics.h" +#include "mozilla/EnumeratedArray.h" +#include "mozilla/TimeStamp.h" +#include "mozilla/TypedEnumBits.h" +#include "mozilla/dom/GamepadPoseState.h" + +namespace mozilla { +namespace layers { +class PTextureParent; +#if defined(XP_WIN) +class TextureSourceD3D11; +#endif +} // namespace layers +namespace gfx { +class VRLayerParent; + +class VRDisplayHost { +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRDisplayHost) + + const VRDisplayInfo& GetDisplayInfo() const { return mDisplayInfo; } + + void AddLayer(VRLayerParent* aLayer); + void RemoveLayer(VRLayerParent* aLayer); + + virtual VRHMDSensorState GetSensorState() = 0; + virtual VRHMDSensorState GetImmediateSensorState() = 0; + virtual void ZeroSensor() = 0; + virtual void StartPresentation() = 0; + virtual void StopPresentation() = 0; + virtual void NotifyVSync() { }; + + void SubmitFrame(VRLayerParent* aLayer, + const int32_t& aInputFrameID, + mozilla::layers::PTextureParent* aTexture, + const gfx::Rect& aLeftEyeRect, + const gfx::Rect& aRightEyeRect); + + bool CheckClearDisplayInfoDirty(); + +protected: + explicit VRDisplayHost(VRDeviceType aType); + virtual ~VRDisplayHost(); + +#if defined(XP_WIN) + virtual void SubmitFrame(mozilla::layers::TextureSourceD3D11* aSource, + const IntSize& aSize, + const VRHMDSensorState& aSensorState, + const gfx::Rect& aLeftEyeRect, + const gfx::Rect& aRightEyeRect) = 0; +#endif + + VRDisplayInfo mDisplayInfo; + + nsTArray<RefPtr<VRLayerParent>> mLayers; + // Weak reference to mLayers entries are cleared in VRLayerParent destructor + + // The maximum number of frames of latency that we would expect before we + // should give up applying pose prediction. + // If latency is greater than one second, then the experience is not likely + // to be corrected by pose prediction. Setting this value too + // high may result in unnecessary memory allocation. + // As the current fastest refresh rate is 90hz, 100 is selected as a + // conservative value. + static const int kMaxLatencyFrames = 100; + VRHMDSensorState mLastSensorState[kMaxLatencyFrames]; + int32_t mInputFrameID; + +private: + VRDisplayInfo mLastUpdateDisplayInfo; +}; + +class VRControllerHost { +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRControllerHost) + + const VRControllerInfo& GetControllerInfo() const; + void SetIndex(uint32_t aIndex); + uint32_t GetIndex(); + void SetButtonPressed(uint64_t aBit); + uint64_t GetButtonPressed(); + void SetPose(const dom::GamepadPoseState& aPose); + const dom::GamepadPoseState& GetPose(); + +protected: + explicit VRControllerHost(VRDeviceType aType); + virtual ~VRControllerHost(); + + VRControllerInfo mControllerInfo; + // The controller index in VRControllerManager. + uint32_t mIndex; + // The current button pressed bit of button mask. + uint64_t mButtonPressed; + dom::GamepadPoseState mPose; +}; + +} // namespace gfx +} // namespace mozilla + +#endif /* GFX_VR_DISPLAY_HOST_H */ |