gecko-dev/gfx/vr/service/OculusSession.h
Kearwood "Kip" Gilbert d6b280c1fb Bug 1598491 - Implement VR process function to scan for XR device runtime installations r=daoshengmu
This is a dependency of the WebXR implementation.

In order to support WebXR's navigator.xr.IsSessionSupported call without
displaying any permission dialogue, it is necessary to have a safe way to
detect the capability of running a VR or AR session without activating XR
runtimes or powering on hardware.

API's such as OpenVR make no guarantee that hardware and software won't be
left activated after enumerating devices, so each backend in gfx/vr/service
must allow for more granular detection of capabilities.

By passing true to bDetectRuntimesOnly, the initialization exits early
after reporting the presence of XR runtime software. The Initialize method
will only enumerate hardware and possibly return true when
aDetectRuntimesOnly is false.

Differential Revision: https://phabricator.services.mozilla.com/D54234

--HG--
extra : moz-landing-system : lando
2019-11-22 01:13:28 +00:00

115 lines
3.8 KiB
C++

/* -*- 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 GFX_VR_SERVICE_OCULUSSESSION_H
#define GFX_VR_SERVICE_OCULUSSESSION_H
#include "VRSession.h"
#include "mozilla/gfx/2D.h"
#include "moz_external_vr.h"
#include "nsTArray.h"
#include "oculus/ovr_capi_dynamic.h"
#include "prlink.h"
#include "ShaderDefinitionsD3D11.h" // for VertexShaderConstants and PixelShaderConstants
struct ID3D11Device;
namespace mozilla {
namespace layers {
struct VertexShaderConstants;
struct PixelShaderConstants;
} // namespace layers
namespace gfx {
class OculusSession : public VRSession {
public:
OculusSession();
virtual ~OculusSession();
bool Initialize(mozilla::gfx::VRSystemState& aSystemState,
bool aDetectRuntimesOnly) override;
void Shutdown() override;
void ProcessEvents(mozilla::gfx::VRSystemState& aSystemState) override;
void StartFrame(mozilla::gfx::VRSystemState& aSystemState) override;
bool StartPresentation() override;
void StopPresentation() override;
bool SubmitFrame(const mozilla::gfx::VRLayer_Stereo_Immersive& aLayer,
ID3D11Texture2D* aTexture) override;
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
float aIntensity, float aDuration) override;
void StopVibrateHaptic(uint32_t aControllerIdx) override;
void StopAllHaptics() override;
private:
bool LoadOvrLib();
void UnloadOvrLib();
bool StartLib(ovrInitFlags aFlags);
void StopLib();
bool StartSession();
void StopSession();
bool StartRendering();
void StopRendering();
bool CreateD3DObjects();
bool CreateShaders();
void DestroyShaders();
void CoverTransitions();
void UpdateVisibility();
bool ChangeVisibility(bool bVisible);
bool InitState(mozilla::gfx::VRSystemState& aSystemState);
void UpdateStageParameters(mozilla::gfx::VRDisplayState& aState);
void UpdateEyeParameters(mozilla::gfx::VRSystemState& aState);
void UpdateHeadsetPose(mozilla::gfx::VRSystemState& aState);
void UpdateControllers(VRSystemState& aState);
void UpdateControllerInputs(VRSystemState& aState,
const ovrInputState& aInputState);
void UpdateHaptics();
void EnumerateControllers(VRSystemState& aState,
const ovrInputState& aInputState);
void UpdateControllerPose(VRSystemState& aState,
const ovrInputState& aInputState);
void UpdateTelemetry(VRSystemState& aSystemState);
bool IsPresentationReady() const;
bool UpdateConstantBuffers();
PRLibrary* mOvrLib;
ovrSession mSession;
ovrInitFlags mInitFlags;
ovrTextureSwapChain mTextureSet;
nsTArray<RefPtr<ID3D11RenderTargetView>> mRTView;
nsTArray<RefPtr<ID3D11Texture2D>> mTexture;
nsTArray<RefPtr<ID3D11ShaderResourceView>> mSRV;
ID3D11VertexShader* mQuadVS;
ID3D11PixelShader* mQuadPS;
RefPtr<ID3D11SamplerState> mLinearSamplerState;
layers::VertexShaderConstants mVSConstants;
layers::PixelShaderConstants mPSConstants;
RefPtr<ID3D11Buffer> mVSConstantBuffer;
RefPtr<ID3D11Buffer> mPSConstantBuffer;
RefPtr<ID3D11Buffer> mVertexBuffer;
RefPtr<ID3D11InputLayout> mInputLayout;
IntSize mPresentationSize;
ovrFovPort mFOVPort[2];
// Most recent HMD eye poses, from start of frame
ovrPosef mFrameStartPose[2];
float mRemainingVibrateTime[2];
float mHapticPulseIntensity[2];
TimeStamp mLastHapticUpdate;
// The timestamp of the last ending presentation
TimeStamp mLastPresentationEnd;
bool mIsPresenting;
};
} // namespace gfx
} // namespace mozilla
#endif // GFX_VR_SERVICE_OCULUSSESSION_H