gecko-dev/gfx/vr/gfxVRPuppet.h
Kearwood Gilbert 043d85c921 Bug 1351048 - Do not load VR libraries until necessary, Oculus cleanup r=daoshengmu
- I have refactored the Oculus and OpenVR interfaces in gfx/vr
  so that initialization of the VR libraries only happens once
  a WebVR site is detected.
- The Oculus interface has been cleaned up and updated to unload the Oculus
  runtime library when not in use.
- The browser can now re-connect to Oculus home if it was restarted, without
  restarting the browser.
- We no longer submit a black frame at the end of VR presentation, as this
  appears to be handled by the latest Oculus runtime automatically.
- As we only hold on to the Oculus runtime when needed, this should
  reduce the likelihood of the GPU process being killed by the Oculus
  software updater.

MozReview-Commit-ID: AyWeD4CxXLD

--HG--
extra : rebase_source : 9eae07ef30b1a7559b5fe80e6698c248a55b970e
2017-03-30 09:35:49 -04:00

131 lines
4.1 KiB
C++

/* -*- 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_PUPPET_H
#define GFX_VR_PUPPET_H
#include "nsTArray.h"
#include "mozilla/RefPtr.h"
#include "gfxVR.h"
namespace mozilla {
namespace gfx {
namespace impl {
class VRDisplayPuppet : public VRDisplayHost
{
public:
void SetDisplayInfo(const VRDisplayInfo& aDisplayInfo);
virtual void NotifyVSync() override;
virtual VRHMDSensorState GetSensorState() override;
void SetSensorState(const VRHMDSensorState& aSensorState);
void ZeroSensor() override;
protected:
virtual void StartPresentation() override;
virtual void StopPresentation() override;
#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) override;
#else
virtual void SubmitFrame(mozilla::layers::TextureSourceOGL* aSource,
const IntSize& aSize,
const VRHMDSensorState& aSensorState,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect);
#endif // XP_WIN
public:
explicit VRDisplayPuppet();
protected:
virtual ~VRDisplayPuppet();
void Destroy();
VRHMDSensorState GetSensorState(double timeOffset);
bool mIsPresenting;
private:
VRHMDSensorState mSensorState;
};
class VRControllerPuppet : public VRControllerHost
{
public:
explicit VRControllerPuppet(dom::GamepadHand aHand);
void SetButtonPressState(uint32_t aButton, bool aPressed);
uint64_t GetButtonPressState();
void SetButtonTouchState(uint32_t aButton, bool aTouched);
uint64_t GetButtonTouchState();
void SetAxisMoveState(uint32_t aAxis, double aValue);
double GetAxisMoveState(uint32_t aAxis);
void SetPoseMoveState(const dom::GamepadPoseState& aPose);
const dom::GamepadPoseState& GetPoseMoveState();
float GetAxisMove(uint32_t aAxis);
void SetAxisMove(uint32_t aAxis, float aValue);
protected:
virtual ~VRControllerPuppet();
private:
uint64_t mButtonPressState;
uint64_t mButtonTouchState;
float mAxisMoveState[3];
float mAxisMove[3];
dom::GamepadPoseState mPoseState;
};
} // namespace impl
class VRSystemManagerPuppet : public VRSystemManager
{
public:
static already_AddRefed<VRSystemManagerPuppet> Create();
virtual void Destroy() override;
virtual void Shutdown() override;
virtual void GetHMDs(nsTArray<RefPtr<VRDisplayHost>>& aHMDResult) override;
virtual bool GetIsPresenting() override;
virtual void HandleInput() override;
virtual void GetControllers(nsTArray<RefPtr<VRControllerHost>>&
aControllerResult) override;
virtual void ScanForControllers() override;
virtual void RemoveControllers() override;
virtual void VibrateHaptic(uint32_t aControllerIdx,
uint32_t aHapticIndex,
double aIntensity,
double aDuration,
uint32_t aPromiseID) override;
virtual void StopVibrateHaptic(uint32_t aControllerIdx) override;
protected:
VRSystemManagerPuppet();
private:
void HandleButtonPress(uint32_t aControllerIdx,
uint32_t aButton,
uint64_t aButtonMask,
uint64_t aButtonPressed,
uint64_t aButtonTouched);
void HandleAxisMove(uint32_t aControllerIndex, uint32_t aAxis,
float aValue);
void HandlePoseTracking(uint32_t aControllerIndex,
const dom::GamepadPoseState& aPose,
VRControllerHost* aController);
// there can only be one
RefPtr<impl::VRDisplayPuppet> mPuppetHMD;
nsTArray<RefPtr<impl::VRControllerPuppet>> mPuppetController;
};
} // namespace gfx
} // namespace mozilla
#endif /* GFX_VR_PUPPET_H*/