Bug 1501455 - Remove gfx/vr/gfxVROculus.cpp and gfx/vr/gfxVROpenVR.cpp r=daoshengmu
authorKearwood "Kip" Gilbert <kgilbert@mozilla.com>
Wed, 24 Oct 2018 22:22:41 +0000
changeset 442903 99bb541e5ce1e45f80f914b99077752bd99d77b5
parent 442902 226a941a7069093cd5770168ee123fa5630c41c1
child 442904 7e0e03b9169e2c5046e8bd8b947edccf04fbdc1b
push id109256
push userncsoregi@mozilla.com
push dateThu, 25 Oct 2018 04:49:18 +0000
treeherdermozilla-inbound@41a7fd6bfe54 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdaoshengmu
bugs1501455
milestone65.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1501455 - Remove gfx/vr/gfxVROculus.cpp and gfx/vr/gfxVROpenVR.cpp r=daoshengmu Now that the VRService thread is enabled by default, we can remove these old files. The OpenVR 3rd party code has been moved from gfx/vr/openvr to gfx/vr/service/openvr to be closer to the OpenVRSession implementation. The Oculus header (ovr_capi_dynamic.h) has been moved from gfx/vr/ovr_capi_dynamic.h to gfx/vr/service/oculus to be closer to the OculusSession implementation. Differential Revision: https://phabricator.services.mozilla.com/D9600
.clang-format-ignore
gfx/vr/VRManager.cpp
gfx/vr/gfxVROculus.cpp
gfx/vr/gfxVROculus.h
gfx/vr/gfxVROpenVR.cpp
gfx/vr/gfxVROpenVR.h
gfx/vr/moz.build
gfx/vr/openvr/LICENSE
gfx/vr/openvr/README.md
gfx/vr/openvr/README.mozilla
gfx/vr/openvr/headers/openvr.h
gfx/vr/openvr/moz.build
gfx/vr/openvr/src/README
gfx/vr/openvr/src/dirtools_public.cpp
gfx/vr/openvr/src/dirtools_public.h
gfx/vr/openvr/src/envvartools_public.cpp
gfx/vr/openvr/src/envvartools_public.h
gfx/vr/openvr/src/hmderrors_public.cpp
gfx/vr/openvr/src/hmderrors_public.h
gfx/vr/openvr/src/ivrclientcore.h
gfx/vr/openvr/src/openvr_api_public.cpp
gfx/vr/openvr/src/pathtools_public.cpp
gfx/vr/openvr/src/pathtools_public.h
gfx/vr/openvr/src/sharedlibtools_public.cpp
gfx/vr/openvr/src/sharedlibtools_public.h
gfx/vr/openvr/src/strtools_public.cpp
gfx/vr/openvr/src/strtools_public.h
gfx/vr/openvr/src/vrpathregistry_public.cpp
gfx/vr/openvr/src/vrpathregistry_public.h
gfx/vr/ovr_capi_dynamic.h
gfx/vr/service/OculusSession.h
gfx/vr/service/moz.build
gfx/vr/service/oculus/ovr_capi_dynamic.h
gfx/vr/service/openvr/LICENSE
gfx/vr/service/openvr/README.md
gfx/vr/service/openvr/README.mozilla
gfx/vr/service/openvr/headers/openvr.h
gfx/vr/service/openvr/moz.build
gfx/vr/service/openvr/src/README
gfx/vr/service/openvr/src/dirtools_public.cpp
gfx/vr/service/openvr/src/dirtools_public.h
gfx/vr/service/openvr/src/envvartools_public.cpp
gfx/vr/service/openvr/src/envvartools_public.h
gfx/vr/service/openvr/src/hmderrors_public.cpp
gfx/vr/service/openvr/src/hmderrors_public.h
gfx/vr/service/openvr/src/ivrclientcore.h
gfx/vr/service/openvr/src/openvr_api_public.cpp
gfx/vr/service/openvr/src/pathtools_public.cpp
gfx/vr/service/openvr/src/pathtools_public.h
gfx/vr/service/openvr/src/sharedlibtools_public.cpp
gfx/vr/service/openvr/src/sharedlibtools_public.h
gfx/vr/service/openvr/src/strtools_public.cpp
gfx/vr/service/openvr/src/strtools_public.h
gfx/vr/service/openvr/src/vrpathregistry_public.cpp
gfx/vr/service/openvr/src/vrpathregistry_public.h
toolkit/content/license.html
tools/rewriting/ThirdPartyPaths.txt
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -47,17 +47,17 @@ extensions/spellcheck/hunspell/src/.*
 gfx/angle/.*
 gfx/cairo/.*
 gfx/graphite2/.*
 gfx/harfbuzz/.*
 gfx/ots/.*
 gfx/qcms/.*
 gfx/sfntly/.*
 gfx/skia/.*
-gfx/vr/openvr/.*
+gfx/vr/service/openvr/.*
 gfx/webrender/.*
 gfx/webrender_api/.*
 gfx/wrench/.*
 gfx/ycbcr/.*
 intl/hyphenation/hyphen/.*
 intl/icu/.*
 ipc/chromium/.*
 js/src/ctypes/libffi/.*
--- a/gfx/vr/VRManager.cpp
+++ b/gfx/vr/VRManager.cpp
@@ -16,22 +16,16 @@
 #include "mozilla/layers/TextureHost.h"
 #include "mozilla/layers/CompositorThread.h"
 #include "mozilla/Unused.h"
 #include "mozilla/gfx/GPUParent.h"
 
 #include "gfxPrefs.h"
 #include "gfxVR.h"
 #include "gfxVRExternal.h"
-#if defined(XP_WIN)
-#include "gfxVROculus.h"
-#endif
-#if defined(XP_WIN) || defined(XP_MACOSX) || (defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID))
-#include "gfxVROpenVR.h"
-#endif
 
 #include "gfxVRPuppet.h"
 #include "ipc/VRLayerParent.h"
 #if !defined(MOZ_WIDGET_ANDROID)
 #include "service/VRService.h"
 #endif
 
 using namespace mozilla;
@@ -80,30 +74,16 @@ VRManager::VRManager()
   , mVRServiceStarted(false)
   , mTaskInterval(0)
 {
   MOZ_COUNT_CTOR(VRManager);
   MOZ_ASSERT(sVRManagerSingleton == nullptr);
 
   RefPtr<VRSystemManager> mgr;
 
-  /**
-   * We must add the VRDisplayManager's to mManagers in a careful order to
-   * ensure that we don't detect the same VRDisplay from multiple API's.
-   *
-   * Oculus comes first, as it will only enumerate Oculus HMD's and is the
-   * native interface for Oculus HMD's.
-   *
-   * OpenvR comes second, as it is the native interface for HTC Vive
-   * which is the most common HMD at this time.
-   *
-   * OSVR will be used if Oculus SDK and OpenVR don't detect any HMDS,
-   * to support everyone else.
-   */
-
 #if !defined(MOZ_WIDGET_ANDROID)
   // The VR Service accesses all hardware from a separate process
   // and replaces the other VRSystemManager when enabled.
   if (!gfxPrefs::VRProcessEnabled()) {
     mVRService = VRService::Create();
   } else if (gfxPrefs::VRProcessEnabled() && XRE_IsGPUProcess()) {
     gfx::GPUParent* gpu = GPUParent::GetSingleton();
     MOZ_ASSERT(gpu);
@@ -119,36 +99,16 @@ VRManager::VRManager()
 
   if (!mExternalManager) {
     mExternalManager = VRSystemManagerExternal::Create();
     if (mExternalManager) {
       mManagers.AppendElement(mExternalManager);
     }
   }
 
-#if defined(XP_WIN)
-  if (!mVRService) {
-    // The Oculus runtime is supported only on Windows
-    mgr = VRSystemManagerOculus::Create();
-    if (mgr) {
-      mManagers.AppendElement(mgr);
-    }
-  }
-#endif
-
-#if defined(XP_WIN) || defined(XP_MACOSX) || (defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID))
-  if (!mVRService) {
-    // OpenVR is cross platform compatible
-    mgr = VRSystemManagerOpenVR::Create();
-    if (mgr) {
-      mManagers.AppendElement(mgr);
-    }
-  } // !mVRService
-#endif
-
   // Enable gamepad extensions while VR is enabled.
   // Preference only can be set at the Parent process.
   if (XRE_IsParentProcess() && gfxPrefs::VREnabled()) {
     Preferences::SetBool("dom.gamepad.extensions.enabled", true);
   }
 }
 
 VRManager::~VRManager()
deleted file mode 100644
--- a/gfx/vr/gfxVROculus.cpp
+++ /dev/null
@@ -1,2067 +0,0 @@
-/* -*- 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 XP_WIN
-#error "Oculus 1.3 runtime support only available for Windows"
-#endif
-
-#include <math.h>
-
-
-#include "prenv.h"
-#include "gfxPrefs.h"
-#include "nsString.h"
-#include "mozilla/DebugOnly.h"
-#include "mozilla/Preferences.h"
-#include "mozilla/SharedLibrary.h"
-#include "mozilla/TimeStamp.h"
-#include "mozilla/gfx/DeviceManagerDx.h"
-#include "mozilla/layers/CompositorThread.h"
-#include "ipc/VRLayerParent.h"
-
-#include "mozilla/gfx/Quaternion.h"
-
-#include <d3d11.h>
-#include "CompositorD3D11.h"
-#include "TextureD3D11.h"
-
-#include "gfxVROculus.h"
-#include "VRManagerParent.h"
-#include "VRThread.h"
-
-#include "mozilla/dom/GamepadEventTypes.h"
-#include "mozilla/dom/GamepadBinding.h"
-#include "mozilla/Telemetry.h"
-
-/** XXX The DX11 objects and quad blitting could be encapsulated
- *    into a separate object if either Oculus starts supporting
- *     non-Windows platforms or the blit is needed by other HMD\
- *     drivers.
- *     Alternately, we could remove the extra blit for
- *     Oculus as well with some more refactoring.
- */
-
-// See CompositorD3D11Shaders.h
-namespace mozilla {
-namespace layers {
-struct ShaderBytes { const void* mData; size_t mLength; };
-extern ShaderBytes sRGBShader;
-extern ShaderBytes sLayerQuadVS;
-} // namespace layers
-} // namespace mozilla
-#ifndef M_PI
-# define M_PI 3.14159265358979323846
-#endif
-
-using namespace mozilla;
-using namespace mozilla::gfx;
-using namespace mozilla::gfx::impl;
-using namespace mozilla::layers;
-using namespace mozilla::dom;
-
-namespace {
-
-static pfn_ovr_Initialize ovr_Initialize = nullptr;
-static pfn_ovr_Shutdown ovr_Shutdown = nullptr;
-static pfn_ovr_GetLastErrorInfo ovr_GetLastErrorInfo = nullptr;
-static pfn_ovr_GetVersionString ovr_GetVersionString = nullptr;
-static pfn_ovr_TraceMessage ovr_TraceMessage = nullptr;
-static pfn_ovr_IdentifyClient ovr_IdentifyClient = nullptr;
-static pfn_ovr_GetHmdDesc ovr_GetHmdDesc = nullptr;
-static pfn_ovr_GetTrackerCount ovr_GetTrackerCount = nullptr;
-static pfn_ovr_GetTrackerDesc ovr_GetTrackerDesc = nullptr;
-static pfn_ovr_Create ovr_Create = nullptr;
-static pfn_ovr_Destroy ovr_Destroy = nullptr;
-static pfn_ovr_GetSessionStatus ovr_GetSessionStatus = nullptr;
-static pfn_ovr_IsExtensionSupported ovr_IsExtensionSupported = nullptr;
-static pfn_ovr_EnableExtension ovr_EnableExtension = nullptr;
-static pfn_ovr_SetTrackingOriginType ovr_SetTrackingOriginType = nullptr;
-static pfn_ovr_GetTrackingOriginType ovr_GetTrackingOriginType = nullptr;
-static pfn_ovr_RecenterTrackingOrigin ovr_RecenterTrackingOrigin = nullptr;
-static pfn_ovr_SpecifyTrackingOrigin ovr_SpecifyTrackingOrigin = nullptr;
-static pfn_ovr_ClearShouldRecenterFlag ovr_ClearShouldRecenterFlag = nullptr;
-static pfn_ovr_GetTrackingState ovr_GetTrackingState = nullptr;
-static pfn_ovr_GetDevicePoses ovr_GetDevicePoses = nullptr;
-static pfn_ovr_GetTrackerPose ovr_GetTrackerPose = nullptr;
-static pfn_ovr_GetInputState ovr_GetInputState = nullptr;
-static pfn_ovr_GetConnectedControllerTypes ovr_GetConnectedControllerTypes = nullptr;
-static pfn_ovr_GetTouchHapticsDesc ovr_GetTouchHapticsDesc = nullptr;
-static pfn_ovr_SetControllerVibration ovr_SetControllerVibration = nullptr;
-static pfn_ovr_SubmitControllerVibration ovr_SubmitControllerVibration = nullptr;
-static pfn_ovr_GetControllerVibrationState ovr_GetControllerVibrationState = nullptr;
-static pfn_ovr_TestBoundary ovr_TestBoundary = nullptr;
-static pfn_ovr_TestBoundaryPoint ovr_TestBoundaryPoint = nullptr;
-static pfn_ovr_SetBoundaryLookAndFeel ovr_SetBoundaryLookAndFeel = nullptr;
-static pfn_ovr_ResetBoundaryLookAndFeel ovr_ResetBoundaryLookAndFeel = nullptr;
-static pfn_ovr_GetBoundaryGeometry ovr_GetBoundaryGeometry = nullptr;
-static pfn_ovr_GetBoundaryDimensions ovr_GetBoundaryDimensions = nullptr;
-static pfn_ovr_GetBoundaryVisible ovr_GetBoundaryVisible = nullptr;
-static pfn_ovr_RequestBoundaryVisible ovr_RequestBoundaryVisible = nullptr;
-static pfn_ovr_GetTextureSwapChainLength ovr_GetTextureSwapChainLength = nullptr;
-static pfn_ovr_GetTextureSwapChainCurrentIndex ovr_GetTextureSwapChainCurrentIndex = nullptr;
-static pfn_ovr_GetTextureSwapChainDesc ovr_GetTextureSwapChainDesc = nullptr;
-static pfn_ovr_CommitTextureSwapChain ovr_CommitTextureSwapChain = nullptr;
-static pfn_ovr_DestroyTextureSwapChain ovr_DestroyTextureSwapChain = nullptr;
-static pfn_ovr_DestroyMirrorTexture ovr_DestroyMirrorTexture = nullptr;
-static pfn_ovr_GetFovTextureSize ovr_GetFovTextureSize = nullptr;
-static pfn_ovr_GetRenderDesc2 ovr_GetRenderDesc2 = nullptr;
-static pfn_ovr_WaitToBeginFrame ovr_WaitToBeginFrame = nullptr;
-static pfn_ovr_BeginFrame ovr_BeginFrame = nullptr;
-static pfn_ovr_EndFrame ovr_EndFrame = nullptr;
-static pfn_ovr_SubmitFrame ovr_SubmitFrame = nullptr;
-static pfn_ovr_GetPerfStats ovr_GetPerfStats = nullptr;
-static pfn_ovr_ResetPerfStats ovr_ResetPerfStats = nullptr;
-static pfn_ovr_GetPredictedDisplayTime ovr_GetPredictedDisplayTime = nullptr;
-static pfn_ovr_GetTimeInSeconds ovr_GetTimeInSeconds = nullptr;
-static pfn_ovr_GetBool ovr_GetBool = nullptr;
-static pfn_ovr_SetBool ovr_SetBool = nullptr;
-static pfn_ovr_GetInt ovr_GetInt = nullptr;
-static pfn_ovr_SetInt ovr_SetInt = nullptr;
-static pfn_ovr_GetFloat ovr_GetFloat = nullptr;
-static pfn_ovr_SetFloat ovr_SetFloat = nullptr;
-static pfn_ovr_GetFloatArray ovr_GetFloatArray = nullptr;
-static pfn_ovr_SetFloatArray ovr_SetFloatArray = nullptr;
-static pfn_ovr_GetString ovr_GetString = nullptr;
-static pfn_ovr_SetString ovr_SetString = nullptr;
-static pfn_ovr_GetExternalCameras ovr_GetExternalCameras = nullptr;
-static pfn_ovr_SetExternalCameraProperties ovr_SetExternalCameraProperties = nullptr;
-
-#ifdef XP_WIN
-static pfn_ovr_CreateTextureSwapChainDX ovr_CreateTextureSwapChainDX = nullptr;
-static pfn_ovr_GetTextureSwapChainBufferDX ovr_GetTextureSwapChainBufferDX = nullptr;
-static pfn_ovr_CreateMirrorTextureDX ovr_CreateMirrorTextureDX = nullptr;
-static pfn_ovr_GetMirrorTextureBufferDX ovr_GetMirrorTextureBufferDX = nullptr;
-#endif
-
-static pfn_ovr_CreateTextureSwapChainGL ovr_CreateTextureSwapChainGL = nullptr;
-static pfn_ovr_GetTextureSwapChainBufferGL ovr_GetTextureSwapChainBufferGL = nullptr;
-static pfn_ovr_CreateMirrorTextureGL ovr_CreateMirrorTextureGL = nullptr;
-static pfn_ovr_GetMirrorTextureBufferGL ovr_GetMirrorTextureBufferGL = nullptr;
-
-#ifdef HAVE_64BIT_BUILD
-#define BUILD_BITS 64
-#else
-#define BUILD_BITS 32
-#endif
-
-#define OVR_PRODUCT_VERSION 1
-#define OVR_MAJOR_VERSION   1
-#define OVR_MINOR_VERSION   19
-
-enum class OculusLeftControllerButtonType : uint16_t {
-  LThumb,
-  IndexTrigger,
-  HandTrigger,
-  Button_X,
-  Button_Y,
-  LThumbRest,
-  NumButtonType
-};
-
-enum class OculusRightControllerButtonType : uint16_t {
-  RThumb,
-  IndexTrigger,
-  HandTrigger,
-  Button_A,
-  Button_B,
-  RThumbRest,
-  NumButtonType
-};
-
-static const uint32_t kNumOculusButton = static_cast<uint32_t>
-                                         (OculusLeftControllerButtonType::
-                                         NumButtonType);
-static const uint32_t kNumOculusHaptcs = 1;
-/*
-ovrFovPort
-ToFovPort(const VRFieldOfView& aFOV)
-{
-  ovrFovPort fovPort;
-  fovPort.LeftTan = tan(aFOV.leftDegrees * M_PI / 180.0);
-  fovPort.RightTan = tan(aFOV.rightDegrees * M_PI / 180.0);
-  fovPort.UpTan = tan(aFOV.upDegrees * M_PI / 180.0);
-  fovPort.DownTan = tan(aFOV.downDegrees * M_PI / 180.0);
-  return fovPort;
-}
-*/
-VRFieldOfView
-FromFovPort(const ovrFovPort& aFOV)
-{
-  VRFieldOfView fovInfo;
-  fovInfo.leftDegrees = atan(aFOV.LeftTan) * 180.0 / M_PI;
-  fovInfo.rightDegrees = atan(aFOV.RightTan) * 180.0 / M_PI;
-  fovInfo.upDegrees = atan(aFOV.UpTan) * 180.0 / M_PI;
-  fovInfo.downDegrees = atan(aFOV.DownTan) * 180.0 / M_PI;
-  return fovInfo;
-}
-
-} // namespace
-
-VROculusSession::VROculusSession()
-  : mOvrLib(nullptr)
-  , mSession(nullptr)
-  , mInitFlags((ovrInitFlags)0)
-  , mTextureSet(nullptr)
-  , mRequestPresentation(false)
-  , mRequestTracking(false)
-  , mDrawBlack(false)
-  , mIsConnected(false)
-  , mIsMounted(false)
-{
-}
-
-ovrSession
-VROculusSession::Get()
-{
-  MOZ_ASSERT(mSession);
-  return mSession;
-}
-
-bool
-VROculusSession::IsTrackingReady() const
-{
-  // We should return true only if the HMD is connected and we
-  // are ready for tracking
-  MOZ_ASSERT(!mIsConnected || mSession);
-  return mIsConnected;
-}
-
-bool
-VROculusSession::IsPresentationReady() const
-{
-  return !mRenderTargets.IsEmpty();
-}
-
-bool
-VROculusSession::IsMounted() const
-{
-  return mIsMounted;
-}
-
-void
-VROculusSession::StopTracking()
-{
-  if (mRequestTracking) {
-    mRequestTracking = false;
-    Refresh();
-  }
-}
-
-void
-VROculusSession::StartTracking()
-{
-  if (!mRequestTracking) {
-    mRequestTracking = true;
-    Refresh();
-  }
-}
-
-void
-VROculusSession::StartPresentation(const IntSize& aSize)
-{
-  if (!mRequestPresentation) {
-    mRequestPresentation = true;
-    mTelemetry.Clear();
-    mTelemetry.mPresentationStart = TimeStamp::Now();
-
-    ovrPerfStats perfStats;
-    if (ovr_GetPerfStats(mSession, &perfStats) == ovrSuccess) {
-      if (perfStats.FrameStatsCount) {
-        mTelemetry.mLastDroppedFrameCount = perfStats.FrameStats[0].AppDroppedFrameCount;
-      }
-    }
-  }
-
-  // Update the size, even when we are already presenting.
-  mPresentationSize = aSize;
-  Refresh();
-}
-
-void
-VROculusSession::StopPresentation()
-{
-  if (mRequestPresentation) {
-    mLastPresentationEnd = TimeStamp::Now();
-    mRequestPresentation = false;
-
-    const TimeDuration duration = mLastPresentationEnd - mTelemetry.mPresentationStart;
-    Telemetry::Accumulate(Telemetry::WEBVR_USERS_VIEW_IN, 1);
-    Telemetry::Accumulate(Telemetry::WEBVR_TIME_SPENT_VIEWING_IN_OCULUS,
-                          duration.ToMilliseconds());
-
-    if (mTelemetry.IsLastDroppedFrameValid() && duration.ToSeconds()) {
-      ovrPerfStats perfStats;
-      if (ovr_GetPerfStats(mSession, &perfStats) == ovrSuccess) {
-        if (perfStats.FrameStatsCount) {
-          const uint32_t droppedFramesPerSec = (perfStats.FrameStats[0].AppDroppedFrameCount -
-                                                mTelemetry.mLastDroppedFrameCount) / duration.ToSeconds();
-          Telemetry::Accumulate(Telemetry::WEBVR_DROPPED_FRAMES_IN_OCULUS, droppedFramesPerSec);
-        }
-      }
-    }
-    Refresh();
-  }
-}
-
-VROculusSession::~VROculusSession()
-{
-  mSubmitThread = nullptr;
-  Uninitialize();
-}
-
-void
-VROculusSession::Uninitialize()
-{
-  StopRendering();
-  StopSession();
-  StopLib();
-  UnloadOvrLib();
-}
-
-void
-VROculusSession::StopRendering()
-{
-  if (!mRenderTargets.IsEmpty()) {
-    mRenderTargets.Clear();
-  }
-  if (mTextureSet && mSession) {
-    ovr_DestroyTextureSwapChain(mSession, mTextureSet);
-  }
-  mTextureSet = nullptr;
-  mDevice = nullptr;
-}
-
-void
-VROculusSession::StopSession()
-{
-  if (mSession) {
-    ovr_Destroy(mSession);
-    mIsConnected = false;
-    mIsMounted = false;
-    mSession = nullptr;
-  }
-}
-
-void
-VROculusSession::StopLib()
-{
-  if (mInitFlags) {
-    ovr_Shutdown();
-    mInitFlags = (ovrInitFlags)0;
-  }
-}
-
-void
-VROculusSession::Refresh(bool aForceRefresh)
-{
-  // We are waiting for drawing the black layer command for
-  // Compositor thread. Ignore Refresh() calls from other threads.
-  if (mDrawBlack && !aForceRefresh) {
-    return;
-  }
-
-  if (!mRequestTracking) {
-    Uninitialize();
-    return;
-  }
-
-  ovrInitFlags flags = (ovrInitFlags)(ovrInit_RequestVersion | ovrInit_MixedRendering);
-  bool bInvisible = true;
-  if (!gfxPrefs::VROculusInvisibleEnabled()) {
-    bInvisible = false;
-  }
-  if (mRequestPresentation) {
-    bInvisible = false;
-  } else if (!mLastPresentationEnd.IsNull()) {
-    TimeDuration duration = TimeStamp::Now() - mLastPresentationEnd;
-    TimeDuration timeout = TimeDuration::FromMilliseconds(gfxPrefs::VROculusPresentTimeout());
-    if (timeout > TimeDuration(0) && duration < timeout) {
-      // Do not immediately re-initialize with an invisible session after
-      // the end of a VR presentation.  Waiting for the configured duraction
-      // ensures that the user will not drop to Oculus Home during VR link
-      // traversal.
-      bInvisible = false;
-
-      // While we are waiting for either the timeout or a new presentation,
-      // fill the HMD with black / no layers.
-      if (mSession && mTextureSet) {
-        if (!aForceRefresh) {
-          // VROculusSession didn't start submitting frames yet.
-          // Or, the VR thread has been shut down already.
-          if (!mSubmitThread || !mSubmitThread->IsActive()) {
-            return;
-          }
-          // ovr_SubmitFrame is running at VR Submit thread,
-          // so we post this task to VR Submit thread and let it paint
-          // a black frame.
-          mDrawBlack = true;
-          mSubmitThread->PostTask(NewRunnableMethod<bool>(
-            "gfx::VROculusSession::Refresh",
-            this,
-            &VROculusSession::Refresh, true));
-          return;
-        }
-        ovrLayerEyeFov layer;
-        memset(&layer, 0, sizeof(layer));
-        layer.Header.Type = ovrLayerType_Disabled;
-        ovrLayerHeader *layers = &layer.Header;
-        ovr_SubmitFrame(mSession, 0, nullptr, &layers, 1);
-        mDrawBlack = false;
-      }
-    }
-  }
-  if (bInvisible) {
-    flags = (ovrInitFlags)(flags | ovrInit_Invisible);
-  }
-
-  if (mInitFlags != flags) {
-    Uninitialize();
-  }
-
-  if(!Initialize(flags)) {
-    // If we fail to initialize, ensure the Oculus libraries
-    // are unloaded, as we can't poll for ovrSessionStatus::ShouldQuit
-    // without an active ovrSession.
-    Uninitialize();
-  }
-
-  if (mSession) {
-    ovrSessionStatus status;
-    if (OVR_SUCCESS(ovr_GetSessionStatus(mSession, &status))) {
-      mIsConnected = status.HmdPresent;
-      mIsMounted = status.HmdMounted;
-      if (status.ShouldQuit) {
-        mLastShouldQuit = TimeStamp::Now();
-        Uninitialize();
-      }
-    } else {
-      mIsConnected = false;
-      mIsMounted = false;
-    }
-  }
-}
-
-bool
-VROculusSession::IsQuitTimeoutActive()
-{
-  // If Oculus asked us to quit our session, do not try to initialize again
-  // immediately.
-  if (!mLastShouldQuit.IsNull()) {
-    TimeDuration duration = TimeStamp::Now() - mLastShouldQuit;
-    TimeDuration timeout = TimeDuration::FromMilliseconds(gfxPrefs::VROculusQuitTimeout());
-    if (timeout > TimeDuration(0) && duration < timeout) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool
-VROculusSession::Initialize(ovrInitFlags aFlags)
-{
-  if (IsQuitTimeoutActive()) {
-    return false;
-  }
-
-  if (!LoadOvrLib()) {
-    return false;
-  }
-  if (!StartLib(aFlags)) {
-    return false;
-  }
-  if (!StartSession()) {
-    return false;
-  }
-  if (!StartRendering()) {
-    return false;
-  }
-  return true;
-}
-
-bool
-VROculusSession::StartRendering()
-{
-  if (!mRequestPresentation) {
-    // Nothing to do if we aren't presenting
-    return true;
-  }
-  if (!mDevice) {
-    mDevice = gfx::DeviceManagerDx::Get()->GetVRDevice();
-    if (!mDevice) {
-      NS_WARNING("Failed to get a D3D11Device for Oculus");
-      return false;
-    }
-  }
-
-  if (!mTextureSet) {
-    /**
-    * The presentation format is determined by content, which describes the
-    * left and right eye rectangles in the VRLayer.  The default, if no
-    * coordinates are passed is to place the left and right eye textures
-    * side-by-side within the buffer.
-    *
-    * XXX - An optimization would be to dynamically resize this buffer
-    *       to accomodate sites that are choosing to render in a lower
-    *       resolution or are using space outside of the left and right
-    *       eye textures for other purposes.  (Bug 1291443)
-    */
-
-    ovrTextureSwapChainDesc desc;
-    memset(&desc, 0, sizeof(desc));
-    desc.Type = ovrTexture_2D;
-    desc.ArraySize = 1;
-    desc.Format = OVR_FORMAT_B8G8R8A8_UNORM_SRGB;
-    desc.Width = mPresentationSize.width;
-    desc.Height = mPresentationSize.height;
-    desc.MipLevels = 1;
-    desc.SampleCount = 1;
-    desc.StaticImage = false;
-    desc.MiscFlags = ovrTextureMisc_DX_Typeless;
-    desc.BindFlags = ovrTextureBind_DX_RenderTarget;
-
-    ovrResult orv = ovr_CreateTextureSwapChainDX(mSession, mDevice, &desc, &mTextureSet);
-    if (orv != ovrSuccess) {
-      NS_WARNING("ovr_CreateTextureSwapChainDX failed");
-      return false;
-    }
-  }
-
-  if (mTextureSet && mRenderTargets.IsEmpty()) {
-    int textureCount = 0;
-    ovrResult orv = ovr_GetTextureSwapChainLength(mSession, mTextureSet, &textureCount);
-    if (orv != ovrSuccess) {
-      NS_WARNING("ovr_GetTextureSwapChainLength failed");
-      return false;
-    }
-    mRenderTargets.SetLength(textureCount);
-    for (int i = 0; i < textureCount; ++i) {
-      RefPtr<CompositingRenderTargetD3D11> rt;
-      ID3D11Texture2D* texture = nullptr;
-      orv = ovr_GetTextureSwapChainBufferDX(mSession, mTextureSet, i, IID_PPV_ARGS(&texture));
-      MOZ_ASSERT(orv == ovrSuccess, "ovr_GetTextureSwapChainBufferDX failed.");
-      rt = new CompositingRenderTargetD3D11(texture, IntPoint(0, 0), DXGI_FORMAT_B8G8R8A8_UNORM);
-      rt->SetSize(mPresentationSize);
-      mRenderTargets[i] = rt;
-      texture->Release();
-    }
-  }
-  return true;
-}
-
-bool
-VROculusSession::StartLib(ovrInitFlags aFlags)
-{
-  if (mInitFlags == 0) {
-    ovrInitParams params;
-    memset(&params, 0, sizeof(params));
-    params.Flags = aFlags;
-    params.RequestedMinorVersion = OVR_MINOR_VERSION;
-    params.LogCallback = nullptr;
-    params.ConnectionTimeoutMS = 0;
-
-    ovrResult orv = ovr_Initialize(&params);
-
-    if (orv == ovrSuccess) {
-      mInitFlags = aFlags;
-    }
-    else {
-      return false;
-    }
-  }
-  MOZ_ASSERT(mInitFlags == aFlags);
-  return true;
-}
-
-bool
-VROculusSession::StartSession()
-{
-  // ovr_Create can be slow when no HMD is present and we wish
-  // to keep the same oculus session when possible, so we detect
-  // presence of an HMD with ovr_GetHmdDesc before calling ovr_Create
-  ovrHmdDesc desc = ovr_GetHmdDesc(NULL);
-  if (desc.Type == ovrHmd_None) {
-    // No HMD connected, destroy any existing session
-    if (mSession) {
-      ovr_Destroy(mSession);
-      mSession = nullptr;
-    }
-    return false;
-  }
-  if (mSession != nullptr) {
-    // HMD Detected and we already have a session, let's keep using it.
-    return true;
-  }
-
-  // HMD Detected and we don't have a session yet,
-  // try to create a new session
-  ovrSession session;
-  ovrGraphicsLuid luid;
-  ovrResult orv = ovr_Create(&session, &luid);
-  if (orv == ovrSuccess) {
-    orv = ovr_SetTrackingOriginType(session, ovrTrackingOrigin_FloorLevel);
-    if (orv != ovrSuccess) {
-      NS_WARNING("ovr_SetTrackingOriginType failed.\n");
-    }
-    mSession = session;
-    return true;
-  }
-
-  // Failed to create a session for the HMD
-  return false;
-}
-
-bool
-VROculusSession::LoadOvrLib()
-{
-  if (mOvrLib) {
-    // Already loaded, early exit
-    return true;
-  }
-#if defined(_WIN32)
-  nsTArray<nsString> libSearchPaths;
-  nsString libName;
-  nsString searchPath;
-
-  for (;;) {
-    UINT requiredLength = ::GetSystemDirectoryW(char16ptr_t(searchPath.BeginWriting()),
-                                                searchPath.Length());
-    if (!requiredLength) {
-      break;
-    }
-    if (requiredLength < searchPath.Length()) {
-      searchPath.Truncate(requiredLength);
-      libSearchPaths.AppendElement(searchPath);
-      break;
-    }
-    searchPath.SetLength(requiredLength);
-  }
-  libName.AppendPrintf("LibOVRRT%d_%d.dll", BUILD_BITS, OVR_PRODUCT_VERSION);
-
-  // search the path/module dir
-  libSearchPaths.InsertElementsAt(0, 1, EmptyString());
-
-  // If the env var is present, we override libName
-  if (_wgetenv(L"OVR_LIB_PATH")) {
-    searchPath = _wgetenv(L"OVR_LIB_PATH");
-    libSearchPaths.InsertElementsAt(0, 1, searchPath);
-  }
-
-  if (_wgetenv(L"OVR_LIB_NAME")) {
-    libName = _wgetenv(L"OVR_LIB_NAME");
-  }
-
-  for (uint32_t i = 0; i < libSearchPaths.Length(); ++i) {
-    nsString& libPath = libSearchPaths[i];
-    nsString fullName;
-    if (libPath.Length() == 0) {
-      fullName.Assign(libName);
-    } else {
-      fullName.Assign(libPath + NS_LITERAL_STRING(u"\\") + libName);
-    }
-
-    mOvrLib = LoadLibraryWithFlags(fullName.get());
-    if (mOvrLib) {
-      break;
-    }
-  }
-#else
-#error "Unsupported platform!"
-#endif
-
-  if (!mOvrLib) {
-    return false;
-  }
-
-#define REQUIRE_FUNCTION(_x) do { \
-    *(void **)&_x = (void *) PR_FindSymbol(mOvrLib, #_x);                \
-    if (!_x) { printf_stderr(#_x " symbol missing\n"); goto fail; }       \
-  } while (0)
-
-  REQUIRE_FUNCTION(ovr_Initialize);
-  REQUIRE_FUNCTION(ovr_Shutdown);
-  REQUIRE_FUNCTION(ovr_GetLastErrorInfo);
-  REQUIRE_FUNCTION(ovr_GetVersionString);
-  REQUIRE_FUNCTION(ovr_TraceMessage);
-  REQUIRE_FUNCTION(ovr_IdentifyClient);
-  REQUIRE_FUNCTION(ovr_GetHmdDesc);
-  REQUIRE_FUNCTION(ovr_GetTrackerCount);
-  REQUIRE_FUNCTION(ovr_GetTrackerDesc);
-  REQUIRE_FUNCTION(ovr_Create);
-  REQUIRE_FUNCTION(ovr_Destroy);
-  REQUIRE_FUNCTION(ovr_GetSessionStatus);
-  REQUIRE_FUNCTION(ovr_IsExtensionSupported);
-  REQUIRE_FUNCTION(ovr_EnableExtension);
-  REQUIRE_FUNCTION(ovr_SetTrackingOriginType);
-  REQUIRE_FUNCTION(ovr_GetTrackingOriginType);
-  REQUIRE_FUNCTION(ovr_RecenterTrackingOrigin);
-  REQUIRE_FUNCTION(ovr_SpecifyTrackingOrigin);
-  REQUIRE_FUNCTION(ovr_ClearShouldRecenterFlag);
-  REQUIRE_FUNCTION(ovr_GetTrackingState);
-  REQUIRE_FUNCTION(ovr_GetDevicePoses);
-  REQUIRE_FUNCTION(ovr_GetTrackerPose);
-  REQUIRE_FUNCTION(ovr_GetInputState);
-  REQUIRE_FUNCTION(ovr_GetConnectedControllerTypes);
-  REQUIRE_FUNCTION(ovr_GetTouchHapticsDesc);
-  REQUIRE_FUNCTION(ovr_SetControllerVibration);
-  REQUIRE_FUNCTION(ovr_SubmitControllerVibration);
-  REQUIRE_FUNCTION(ovr_GetControllerVibrationState);
-  REQUIRE_FUNCTION(ovr_TestBoundary);
-  REQUIRE_FUNCTION(ovr_TestBoundaryPoint);
-  REQUIRE_FUNCTION(ovr_SetBoundaryLookAndFeel);
-  REQUIRE_FUNCTION(ovr_ResetBoundaryLookAndFeel);
-  REQUIRE_FUNCTION(ovr_GetBoundaryGeometry);
-  REQUIRE_FUNCTION(ovr_GetBoundaryDimensions);
-  REQUIRE_FUNCTION(ovr_GetBoundaryVisible);
-  REQUIRE_FUNCTION(ovr_RequestBoundaryVisible);
-  REQUIRE_FUNCTION(ovr_GetTextureSwapChainLength);
-  REQUIRE_FUNCTION(ovr_GetTextureSwapChainCurrentIndex);
-  REQUIRE_FUNCTION(ovr_GetTextureSwapChainDesc);
-  REQUIRE_FUNCTION(ovr_CommitTextureSwapChain);
-  REQUIRE_FUNCTION(ovr_DestroyTextureSwapChain);
-  REQUIRE_FUNCTION(ovr_DestroyMirrorTexture);
-  REQUIRE_FUNCTION(ovr_GetFovTextureSize);
-  REQUIRE_FUNCTION(ovr_GetRenderDesc2);
-  REQUIRE_FUNCTION(ovr_WaitToBeginFrame);
-  REQUIRE_FUNCTION(ovr_BeginFrame);
-  REQUIRE_FUNCTION(ovr_EndFrame);
-  REQUIRE_FUNCTION(ovr_SubmitFrame);
-  REQUIRE_FUNCTION(ovr_GetPerfStats);
-  REQUIRE_FUNCTION(ovr_ResetPerfStats);
-  REQUIRE_FUNCTION(ovr_GetPredictedDisplayTime);
-  REQUIRE_FUNCTION(ovr_GetTimeInSeconds);
-  REQUIRE_FUNCTION(ovr_GetBool);
-  REQUIRE_FUNCTION(ovr_SetBool);
-  REQUIRE_FUNCTION(ovr_GetInt);
-  REQUIRE_FUNCTION(ovr_SetInt);
-  REQUIRE_FUNCTION(ovr_GetFloat);
-  REQUIRE_FUNCTION(ovr_SetFloat);
-  REQUIRE_FUNCTION(ovr_GetFloatArray);
-  REQUIRE_FUNCTION(ovr_SetFloatArray);
-  REQUIRE_FUNCTION(ovr_GetString);
-  REQUIRE_FUNCTION(ovr_SetString);
-  REQUIRE_FUNCTION(ovr_GetExternalCameras);
-  REQUIRE_FUNCTION(ovr_SetExternalCameraProperties);
-
-#ifdef XP_WIN
-
-  REQUIRE_FUNCTION(ovr_CreateTextureSwapChainDX);
-  REQUIRE_FUNCTION(ovr_GetTextureSwapChainBufferDX);
-  REQUIRE_FUNCTION(ovr_CreateMirrorTextureDX);
-  REQUIRE_FUNCTION(ovr_GetMirrorTextureBufferDX);
-
-#endif
-
-  REQUIRE_FUNCTION(ovr_CreateTextureSwapChainGL);
-  REQUIRE_FUNCTION(ovr_GetTextureSwapChainBufferGL);
-  REQUIRE_FUNCTION(ovr_CreateMirrorTextureGL);
-  REQUIRE_FUNCTION(ovr_GetMirrorTextureBufferGL);
-
-#undef REQUIRE_FUNCTION
-
-  return true;
-
- fail:
-  ovr_Initialize = nullptr;
-  PR_UnloadLibrary(mOvrLib);
-  mOvrLib = nullptr;
-  return false;
-}
-
-already_AddRefed<CompositingRenderTargetD3D11>
-VROculusSession::GetNextRenderTarget()
-{
-  int currentRenderTarget = 0;
-  DebugOnly<ovrResult> orv = ovr_GetTextureSwapChainCurrentIndex(mSession, mTextureSet, &currentRenderTarget);
-  MOZ_ASSERT(orv == ovrSuccess, "ovr_GetTextureSwapChainCurrentIndex failed.");
-
-  mRenderTargets[currentRenderTarget]->ClearOnBind();
-  RefPtr<CompositingRenderTargetD3D11> rt = mRenderTargets[currentRenderTarget];
-  return rt.forget();
-}
-
-ovrTextureSwapChain
-VROculusSession::GetSwapChain()
-{
-  MOZ_ASSERT(mTextureSet);
-  return mTextureSet;
-}
-
-void
-VROculusSession::UnloadOvrLib()
-{
-  if (mOvrLib) {
-    PR_UnloadLibrary(mOvrLib);
-    mOvrLib = nullptr;
-  }
-}
-
-VRDisplayOculus::VRDisplayOculus(VROculusSession* aSession)
-  : VRDisplayLocal(VRDeviceType::Oculus)
-  , mSession(aSession)
-  , mQuadVS(nullptr)
-  , mQuadPS(nullptr)
-  , mLinearSamplerState(nullptr)
-  , mVSConstantBuffer(nullptr)
-  , mPSConstantBuffer(nullptr)
-  , mVertexBuffer(nullptr)
-  , mInputLayout(nullptr)
-  , mEyeHeight(OVR_DEFAULT_EYE_HEIGHT)
-{
-  MOZ_COUNT_CTOR_INHERITED(VRDisplayOculus, VRDisplayLocal);
-  VRDisplayState& state = mDisplayInfo.mDisplayState;
-  strncpy(state.mDisplayName, "Oculus VR HMD", kVRDisplayNameMaxLen);
-  state.mIsConnected = true;
-  state.mIsMounted = false;
-
-  mDesc = ovr_GetHmdDesc(aSession->Get());
-
-  state.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None;
-  if (mDesc.AvailableTrackingCaps & ovrTrackingCap_Orientation) {
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_Orientation;
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_AngularAcceleration;
-  }
-  if (mDesc.AvailableTrackingCaps & ovrTrackingCap_Position) {
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_Position;
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_LinearAcceleration;
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_StageParameters;
-  }
-  state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_External;
-  state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_MountDetection;
-  state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_Present;
-
-  mFOVPort[VRDisplayState::Eye_Left] = mDesc.DefaultEyeFov[ovrEye_Left];
-  mFOVPort[VRDisplayState::Eye_Right] = mDesc.DefaultEyeFov[ovrEye_Right];
-
-  state.mEyeFOV[VRDisplayState::Eye_Left] = FromFovPort(mFOVPort[VRDisplayState::Eye_Left]);
-  state.mEyeFOV[VRDisplayState::Eye_Right] = FromFovPort(mFOVPort[VRDisplayState::Eye_Right]);
-
-  float pixelsPerDisplayPixel = 1.0;
-  ovrSizei texSize[2];
-
-  // get eye texture sizes
-  for (uint32_t eye = 0; eye < VRDisplayState::NumEyes; eye++) {
-    texSize[eye] = ovr_GetFovTextureSize(mSession->Get(), (ovrEyeType)eye, mFOVPort[eye], pixelsPerDisplayPixel);
-  }
-
-  // take the max of both for eye resolution
-  state.mEyeResolution.width = std::max(texSize[VRDisplayState::Eye_Left].w, texSize[VRDisplayState::Eye_Right].w);
-  state.mEyeResolution.height = std::max(texSize[VRDisplayState::Eye_Left].h, texSize[VRDisplayState::Eye_Right].h);
-
-  UpdateEyeParameters();
-  UpdateStageParameters();
-}
-
-VRDisplayOculus::~VRDisplayOculus() {
-  Destroy();
-  MOZ_COUNT_DTOR_INHERITED(VRDisplayOculus, VRDisplayLocal);
-}
-
-void
-VRDisplayOculus::Destroy()
-{
-  StopPresentation();
-  mSession = nullptr;
-}
-
-void
-VRDisplayOculus::UpdateEyeParameters(gfx::Matrix4x4* aHeadToEyeTransforms /* = nullptr */)
-{
-  // Note this must be called every frame, as the IPD adjustment can be changed
-  // by the user during a VR session.
-  for (uint32_t eye = 0; eye < VRDisplayState::NumEyes; eye++) {
-    // As of Oculus 1.17 SDK, we must use the ovr_GetRenderDesc2 function to return the updated
-    // version of ovrEyeRenderDesc.  This is normally done by the Oculus static lib shim, but we
-    // need to do this explicitly as we are loading the Oculus runtime dll directly.
-    ovrEyeRenderDesc renderDesc = ovr_GetRenderDesc2(mSession->Get(), (ovrEyeType)eye, mFOVPort[eye]);
-    VRDisplayState& state = mDisplayInfo.mDisplayState;
-    state.mEyeTranslation[eye].x = renderDesc.HmdToEyePose.Position.x;
-    state.mEyeTranslation[eye].y = renderDesc.HmdToEyePose.Position.y;
-    state.mEyeTranslation[eye].z = renderDesc.HmdToEyePose.Position.z;
-    if (aHeadToEyeTransforms) {
-      Matrix4x4 pose;
-      pose.SetRotationFromQuaternion(gfx::Quaternion(renderDesc.HmdToEyePose.Orientation.x, renderDesc.HmdToEyePose.Orientation.y, renderDesc.HmdToEyePose.Orientation.z, renderDesc.HmdToEyePose.Orientation.w));
-      pose.PreTranslate(renderDesc.HmdToEyePose.Position.x, renderDesc.HmdToEyePose.Position.y, renderDesc.HmdToEyePose.Position.z);
-      pose.Invert();
-      aHeadToEyeTransforms[eye] = pose;
-    }
-  }
-}
-
-void
-VRDisplayOculus::UpdateStageParameters()
-{
-  if (!mSession->IsTrackingReady()) {
-    return;
-  }
-  VRDisplayState& state = mDisplayInfo.mDisplayState;
-  ovrVector3f playArea;
-  ovrResult res = ovr_GetBoundaryDimensions(mSession->Get(), ovrBoundary_PlayArea, &playArea);
-  if (res == ovrSuccess) {
-    state.mStageSize.width = playArea.x;
-    state.mStageSize.height = playArea.z;
-  } else {
-    // If we fail, fall back to reasonable defaults.
-    // 1m x 1m space
-    state.mStageSize.width = 1.0f;
-    state.mStageSize.height = 1.0f;
-  }
-
-  mEyeHeight = ovr_GetFloat(mSession->Get(), OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT);
-
-  state.mSittingToStandingTransform[0] = 1.0f;
-  state.mSittingToStandingTransform[1] = 0.0f;
-  state.mSittingToStandingTransform[2] = 0.0f;
-  state.mSittingToStandingTransform[3] = 0.0f;
-
-  state.mSittingToStandingTransform[4] = 0.0f;
-  state.mSittingToStandingTransform[5] = 1.0f;
-  state.mSittingToStandingTransform[6] = 0.0f;
-  state.mSittingToStandingTransform[7] = 0.0f;
-
-  state.mSittingToStandingTransform[8] = 0.0f;
-  state.mSittingToStandingTransform[9] = 0.0f;
-  state.mSittingToStandingTransform[10] = 1.0f;
-  state.mSittingToStandingTransform[11] = 0.0f;
-
-  state.mSittingToStandingTransform[12] = 0.0f;
-  state.mSittingToStandingTransform[13] = mEyeHeight;
-  state.mSittingToStandingTransform[14] = 0.0f;
-  state.mSittingToStandingTransform[15] = 1.0f;
-}
-
-void
-VRDisplayOculus::ZeroSensor()
-{
-  if (!mSession->IsTrackingReady()) {
-    return;
-  }
-  ovr_RecenterTrackingOrigin(mSession->Get());
-  UpdateStageParameters();
-}
-
-VRHMDSensorState
-VRDisplayOculus::GetSensorState()
-{
-  VRHMDSensorState result{};
-  if (mSession->IsTrackingReady()) {
-    gfx::Matrix4x4 headToEyeTransforms[2];
-    UpdateEyeParameters(headToEyeTransforms);
-    double predictedFrameTime = 0.0f;
-    if (gfxPrefs::VRPosePredictionEnabled()) {
-      // XXX We might need to call ovr_GetPredictedDisplayTime even if we don't use the result.
-      // If we don't call it, the Oculus driver will spew out many warnings...
-      predictedFrameTime = ovr_GetPredictedDisplayTime(mSession->Get(), 0);
-    }
-    result = GetSensorState(predictedFrameTime);
-    result.pose.position[1] -= mEyeHeight;
-    result.CalcViewMatrices(headToEyeTransforms);
-  }
-  result.inputFrameID = mDisplayInfo.mFrameId;
-
-  return result;
-}
-
-VRHMDSensorState
-VRDisplayOculus::GetSensorState(double absTime)
-{
-  VRHMDSensorState result{};
-
-  ovrTrackingState state = ovr_GetTrackingState(mSession->Get(), absTime, true);
-  ovrPoseStatef& pose(state.HeadPose);
-
-  result.timestamp = pose.TimeInSeconds;
-
-  if (state.StatusFlags & ovrStatus_OrientationTracked) {
-    result.flags |= VRDisplayCapabilityFlags::Cap_Orientation;
-
-    result.pose.orientation[0] = pose.ThePose.Orientation.x;
-    result.pose.orientation[1] = pose.ThePose.Orientation.y;
-    result.pose.orientation[2] = pose.ThePose.Orientation.z;
-    result.pose.orientation[3] = pose.ThePose.Orientation.w;
-
-    result.pose.angularVelocity[0] = pose.AngularVelocity.x;
-    result.pose.angularVelocity[1] = pose.AngularVelocity.y;
-    result.pose.angularVelocity[2] = pose.AngularVelocity.z;
-
-    result.flags |= VRDisplayCapabilityFlags::Cap_AngularAcceleration;
-
-    result.pose.angularAcceleration[0] = pose.AngularAcceleration.x;
-    result.pose.angularAcceleration[1] = pose.AngularAcceleration.y;
-    result.pose.angularAcceleration[2] = pose.AngularAcceleration.z;
-  } else {
-    // default to an identity quaternion
-    result.pose.orientation[3] = 1.0f;
-  }
-
-  if (state.StatusFlags & ovrStatus_PositionTracked) {
-    result.flags |= VRDisplayCapabilityFlags::Cap_Position;
-
-    result.pose.position[0] = pose.ThePose.Position.x;
-    result.pose.position[1] = pose.ThePose.Position.y;
-    result.pose.position[2] = pose.ThePose.Position.z;
-
-    result.pose.linearVelocity[0] = pose.LinearVelocity.x;
-    result.pose.linearVelocity[1] = pose.LinearVelocity.y;
-    result.pose.linearVelocity[2] = pose.LinearVelocity.z;
-
-    result.flags |= VRDisplayCapabilityFlags::Cap_LinearAcceleration;
-
-    result.pose.linearAcceleration[0] = pose.LinearAcceleration.x;
-    result.pose.linearAcceleration[1] = pose.LinearAcceleration.y;
-    result.pose.linearAcceleration[2] = pose.LinearAcceleration.z;
-  }
-  result.flags |= VRDisplayCapabilityFlags::Cap_External;
-  result.flags |= VRDisplayCapabilityFlags::Cap_MountDetection;
-  result.flags |= VRDisplayCapabilityFlags::Cap_Present;
-
-  return result;
-}
-
-void
-VRDisplayOculus::StartPresentation()
-{
-  if (!CreateD3DObjects()) {
-    return;
-  }
-  mSession->StartPresentation(IntSize(mDisplayInfo.mDisplayState.mEyeResolution.width * 2, mDisplayInfo.mDisplayState.mEyeResolution.height));
-  if (!mSession->IsPresentationReady()) {
-    return;
-  }
-
-  if (!mQuadVS) {
-    if (FAILED(mDevice->CreateVertexShader(sLayerQuadVS.mData, sLayerQuadVS.mLength, nullptr, &mQuadVS))) {
-      NS_WARNING("Failed to create vertex shader for Oculus");
-      return;
-    }
-  }
-
-  if (!mQuadPS) {
-    if (FAILED(mDevice->CreatePixelShader(sRGBShader.mData, sRGBShader.mLength, nullptr, &mQuadPS))) {
-      NS_WARNING("Failed to create pixel shader for Oculus");
-      return;
-    }
-  }
-
-  CD3D11_BUFFER_DESC cBufferDesc(sizeof(layers::VertexShaderConstants),
-    D3D11_BIND_CONSTANT_BUFFER,
-    D3D11_USAGE_DYNAMIC,
-    D3D11_CPU_ACCESS_WRITE);
-
-  if (!mVSConstantBuffer) {
-    if (FAILED(mDevice->CreateBuffer(&cBufferDesc, nullptr, getter_AddRefs(mVSConstantBuffer)))) {
-      NS_WARNING("Failed to vertex shader constant buffer for Oculus");
-      return;
-    }
-  }
-
-  if (!mPSConstantBuffer) {
-    cBufferDesc.ByteWidth = sizeof(layers::PixelShaderConstants);
-    if (FAILED(mDevice->CreateBuffer(&cBufferDesc, nullptr, getter_AddRefs(mPSConstantBuffer)))) {
-      NS_WARNING("Failed to pixel shader constant buffer for Oculus");
-      return;
-    }
-  }
-
-  if (!mLinearSamplerState) {
-    CD3D11_SAMPLER_DESC samplerDesc(D3D11_DEFAULT);
-    if (FAILED(mDevice->CreateSamplerState(&samplerDesc, getter_AddRefs(mLinearSamplerState)))) {
-      NS_WARNING("Failed to create sampler state for Oculus");
-      return;
-    }
-  }
-
-  if (!mInputLayout) {
-    D3D11_INPUT_ELEMENT_DESC layout[] =
-    {
-      { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-    };
-
-    if (FAILED(mDevice->CreateInputLayout(layout,
-                                              sizeof(layout) / sizeof(D3D11_INPUT_ELEMENT_DESC),
-                                              sLayerQuadVS.mData,
-                                              sLayerQuadVS.mLength,
-                                              getter_AddRefs(mInputLayout)))) {
-      NS_WARNING("Failed to create input layout for Oculus");
-      return;
-    }
-  }
-
-  if (!mVertexBuffer) {
-    Vertex vertices[] = { { { 0.0, 0.0 } },{ { 1.0, 0.0 } },{ { 0.0, 1.0 } },{ { 1.0, 1.0 } } };
-    CD3D11_BUFFER_DESC bufferDesc(sizeof(vertices), D3D11_BIND_VERTEX_BUFFER);
-    D3D11_SUBRESOURCE_DATA data;
-    data.pSysMem = (void*)vertices;
-
-    if (FAILED(mDevice->CreateBuffer(&bufferDesc, &data, getter_AddRefs(mVertexBuffer)))) {
-      NS_WARNING("Failed to create vertex buffer for Oculus");
-      return;
-    }
-  }
-
-  memset(&mVSConstants, 0, sizeof(mVSConstants));
-  memset(&mPSConstants, 0, sizeof(mPSConstants));
-}
-
-void
-VRDisplayOculus::StopPresentation()
-{
-  if (mSession) {
-    mSession->StopPresentation();
-  }
-}
-
-bool
-VRDisplayOculus::UpdateConstantBuffers()
-{
-  HRESULT hr;
-  D3D11_MAPPED_SUBRESOURCE resource;
-  resource.pData = nullptr;
-
-  hr = mContext->Map(mVSConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
-  if (FAILED(hr) || !resource.pData) {
-    return false;
-  }
-  *(VertexShaderConstants*)resource.pData = mVSConstants;
-  mContext->Unmap(mVSConstantBuffer, 0);
-  resource.pData = nullptr;
-
-  hr = mContext->Map(mPSConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
-  if (FAILED(hr) || !resource.pData) {
-    return false;
-  }
-  *(PixelShaderConstants*)resource.pData = mPSConstants;
-  mContext->Unmap(mPSConstantBuffer, 0);
-
-  ID3D11Buffer *buffer = mVSConstantBuffer;
-  mContext->VSSetConstantBuffers(0, 1, &buffer);
-  buffer = mPSConstantBuffer;
-  mContext->PSSetConstantBuffers(0, 1, &buffer);
-  return true;
-}
-
-bool
-VRDisplayOculus::SubmitFrame(ID3D11Texture2D* aSource,
-                             const IntSize& aSize,
-                             const gfx::Rect& aLeftEyeRect,
-                             const gfx::Rect& aRightEyeRect)
-{
-  MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
-  if (!CreateD3DObjects()) {
-    return false;
-  }
-
-  AutoRestoreRenderState restoreState(this);
-  if (!restoreState.IsSuccess()) {
-    return false;
-  }
-
-  if (!mSession->IsPresentationReady()) {
-    return false;
-  }
-  /**
-    * XXX - We should resolve fail the promise returned by
-    *       VRDisplay.requestPresent() when the DX11 resources fail allocation
-    *       in VRDisplayOculus::StartPresentation().
-    *       Bailing out here prevents the crash but content should be aware
-    *       that frames are not being presented.
-    *       See Bug 1299309.
-    **/
-
-  RefPtr<CompositingRenderTargetD3D11> surface = mSession->GetNextRenderTarget();
-
-  surface->BindRenderTarget(mContext);
-
-  Matrix viewMatrix = Matrix::Translation(-1.0, 1.0);
-  viewMatrix.PreScale(2.0f / float(aSize.width), 2.0f / float(aSize.height));
-  viewMatrix.PreScale(1.0f, -1.0f);
-  Matrix4x4 projection = Matrix4x4::From2D(viewMatrix);
-  projection._33 = 0.0f;
-
-  Matrix transform2d;
-  gfx::Matrix4x4 transform = gfx::Matrix4x4::From2D(transform2d);
-
-  D3D11_VIEWPORT viewport;
-  viewport.MinDepth = 0.0f;
-  viewport.MaxDepth = 1.0f;
-  viewport.Width = aSize.width;
-  viewport.Height = aSize.height;
-  viewport.TopLeftX = 0;
-  viewport.TopLeftY = 0;
-
-  D3D11_RECT scissor;
-  scissor.left = 0;
-  scissor.right = aSize.width;
-  scissor.top = 0;
-  scissor.bottom = aSize.height;
-
-  memcpy(&mVSConstants.layerTransform, &transform._11, sizeof(mVSConstants.layerTransform));
-  memcpy(&mVSConstants.projection, &projection._11, sizeof(mVSConstants.projection));
-  mVSConstants.renderTargetOffset[0] = 0.0f;
-  mVSConstants.renderTargetOffset[1] = 0.0f;
-  mVSConstants.layerQuad = Rect(0.0f, 0.0f, aSize.width, aSize.height);
-  mVSConstants.textureCoords = Rect(0.0f, 1.0f, 1.0f, -1.0f);
-
-  mPSConstants.layerOpacity[0] = 1.0f;
-
-  ID3D11Buffer* vbuffer = mVertexBuffer;
-  UINT vsize = sizeof(Vertex);
-  UINT voffset = 0;
-  mContext->IASetVertexBuffers(0, 1, &vbuffer, &vsize, &voffset);
-  mContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_R16_UINT, 0);
-  mContext->IASetInputLayout(mInputLayout);
-  mContext->RSSetViewports(1, &viewport);
-  mContext->RSSetScissorRects(1, &scissor);
-  mContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-  mContext->VSSetShader(mQuadVS, nullptr, 0);
-  mContext->PSSetShader(mQuadPS, nullptr, 0);
-
-  RefPtr<ID3D11ShaderResourceView> srView;
-  HRESULT hr = mDevice->CreateShaderResourceView(aSource, nullptr, getter_AddRefs(srView));
-  if (FAILED(hr)) {
-    gfxWarning() << "Could not create shader resource view for Oculus: " << hexa(hr);
-    return false;
-  }
-  ID3D11ShaderResourceView* viewPtr = srView.get();
-  mContext->PSSetShaderResources(0 /* 0 == TexSlot::RGB */, 1, &viewPtr);
-  // XXX Use Constant from TexSlot in CompositorD3D11.cpp?
-
-  ID3D11SamplerState *sampler = mLinearSamplerState;
-  mContext->PSSetSamplers(0, 1, &sampler);
-
-  if (!UpdateConstantBuffers()) {
-    NS_WARNING("Failed to update constant buffers for Oculus");
-    return false;
-  }
-
-  mContext->Draw(4, 0);
-
-  ovrResult orv = ovr_CommitTextureSwapChain(mSession->Get(), mSession->GetSwapChain());
-  if (orv != ovrSuccess) {
-    NS_WARNING("ovr_CommitTextureSwapChain failed.\n");
-    return false;
-  }
-
-  ovrLayerEyeFov layer;
-  memset(&layer, 0, sizeof(layer));
-  layer.Header.Type = ovrLayerType_EyeFov;
-  layer.Header.Flags = 0;
-  layer.ColorTexture[0] = mSession->GetSwapChain();
-  layer.ColorTexture[1] = nullptr;
-  layer.Fov[0] = mFOVPort[0];
-  layer.Fov[1] = mFOVPort[1];
-  layer.Viewport[0].Pos.x = aSize.width * aLeftEyeRect.X();
-  layer.Viewport[0].Pos.y = aSize.height * aLeftEyeRect.Y();
-  layer.Viewport[0].Size.w = aSize.width * aLeftEyeRect.Width();
-  layer.Viewport[0].Size.h = aSize.height * aLeftEyeRect.Height();
-  layer.Viewport[1].Pos.x = aSize.width * aRightEyeRect.X();
-  layer.Viewport[1].Pos.y = aSize.height * aRightEyeRect.Y();
-  layer.Viewport[1].Size.w = aSize.width * aRightEyeRect.Width();
-  layer.Viewport[1].Size.h = aSize.height * aRightEyeRect.Height();
-
-  const VRHMDSensorState& sensorState = mDisplayInfo.GetSensorState();
-  gfx::Matrix4x4 matView[2];
-  memcpy(matView[0].components, sensorState.leftViewMatrix, sizeof(sensorState.leftViewMatrix));
-  memcpy(matView[1].components, sensorState.rightViewMatrix, sizeof(sensorState.rightViewMatrix));
-
-  for (uint32_t i = 0; i < 2; ++i) {
-    Point3D eyeTranslation;
-    Quaternion eyeRotation;
-    Point3D eyeScale;
-    if (!matView[i].Decompose(eyeTranslation, eyeRotation, eyeScale)) {
-      NS_WARNING("Failed to decompose eye pose matrix for Oculus");
-    }
-    layer.RenderPose[i].Orientation.x = eyeRotation.x;
-    layer.RenderPose[i].Orientation.y = eyeRotation.y;
-    layer.RenderPose[i].Orientation.z = eyeRotation.z;
-    layer.RenderPose[i].Orientation.w = eyeRotation.w;
-    layer.RenderPose[i].Position.x = eyeTranslation.x;
-    layer.RenderPose[i].Position.y = eyeTranslation.y;
-    layer.RenderPose[i].Position.z = eyeTranslation.z;
-  }
-
-  ovrLayerHeader *layers = &layer.Header;
-  orv = ovr_SubmitFrame(mSession->Get(), mDisplayInfo.mFrameId, nullptr, &layers, 1);
-  // ovr_SubmitFrame will fail during the Oculus health and safety warning.
-  // and will start succeeding once the warning has been dismissed by the user.
-
-  if (!OVR_UNQUALIFIED_SUCCESS(orv)) {
-    /**
-     * We wish to throttle the framerate for any case that the rendered
-     * result is not visible.  In some cases, such as during the Oculus
-     * "health and safety warning", orv will be > 0 (OVR_SUCCESS but not
-     * OVR_UNQUALIFIED_SUCCESS) and ovr_SubmitFrame will not block.
-     * In this case, returning true would have resulted in an unthrottled
-     * render loop hiting excessive frame rates and consuming resources.
-     */
-    return false;
-  }
-
-  mSession->mSubmitThread = mSubmitThread;
-  return true;
-}
-
-void
-VRDisplayOculus::Refresh()
-{
-  mDisplayInfo.mDisplayState.mIsConnected = mSession->IsTrackingReady();
-  mDisplayInfo.mDisplayState.mIsMounted = mSession->IsMounted();
-}
-
-VRControllerOculus::VRControllerOculus(dom::GamepadHand aHand, uint32_t aDisplayID)
-  : VRControllerHost(VRDeviceType::Oculus, aHand, aDisplayID)
-  , mIndexTrigger(0.0f)
-  , mHandTrigger(0.0f)
-  , mVibrateThread(nullptr)
-  , mIsVibrateStopped(false)
-{
-  MOZ_COUNT_CTOR_INHERITED(VRControllerOculus, VRControllerHost);
-
-  VRControllerState& state = mControllerInfo.mControllerState;
-
-  char* touchID = (char*)"";
-  switch (aHand) {
-    case dom::GamepadHand::Left:
-      touchID = (char*)"Oculus Touch (Left)";
-      break;
-    case dom::GamepadHand::Right:
-      touchID = (char*)"Oculus Touch (Right)";
-      break;
-    default:
-      MOZ_ASSERT(false);
-      break;
-  }
-
-  strncpy(state.controllerName, touchID, kVRControllerNameMaxLen);
-
-  MOZ_ASSERT(kNumOculusButton ==
-             static_cast<uint32_t>(OculusLeftControllerButtonType::NumButtonType)
-             && kNumOculusButton ==
-             static_cast<uint32_t>(OculusRightControllerButtonType::NumButtonType));
-
-  state.numButtons = kNumOculusButton;
-  state.numAxes = static_cast<uint32_t>(
-                   OculusControllerAxisType::NumVRControllerAxisType);
-  state.numHaptics = kNumOculusHaptcs;
-}
-
-float
-VRControllerOculus::GetAxisMove(uint32_t aAxis)
-{
-  return mAxisMove[aAxis];
-}
-
-void
-VRControllerOculus::SetAxisMove(uint32_t aAxis, float aValue)
-{
-  mAxisMove[aAxis] = aValue;
-}
-
-float
-VRControllerOculus::GetIndexTrigger()
-{
-  return mIndexTrigger;
-}
-
-void
-VRControllerOculus::SetIndexTrigger(float aValue)
-{
-  mIndexTrigger = aValue;
-}
-
-float
-VRControllerOculus::GetHandTrigger()
-{
-  return mHandTrigger;
-}
-
-void
-VRControllerOculus::SetHandTrigger(float aValue)
-{
-  mHandTrigger = aValue;
-}
-
-VRControllerOculus::~VRControllerOculus()
-{
-  ShutdownVibrateHapticThread();
-  MOZ_COUNT_DTOR_INHERITED(VRControllerOculus, VRControllerHost);
-}
-
-void
-VRControllerOculus::UpdateVibrateHaptic(ovrSession aSession,
-                                        uint32_t aHapticIndex,
-                                        double aIntensity,
-                                        double aDuration,
-                                        uint64_t aVibrateIndex,
-                                        const VRManagerPromise& aPromise)
-{
-  // UpdateVibrateHaptic() only can be called by mVibrateThread
-  MOZ_ASSERT(mVibrateThread->GetThread() == NS_GetCurrentThread());
-
-  // It has been interrupted by loss focus.
-  if (mIsVibrateStopped) {
-    VibrateHapticComplete(aSession, aPromise, true);
-    return;
-  }
-  // Avoid the previous vibrate event to override the new one.
-  if (mVibrateIndex != aVibrateIndex) {
-    VibrateHapticComplete(aSession, aPromise, false);
-    return;
-  }
-
-  const double duration = (aIntensity == 0) ? 0 : aDuration;
-  // Vibration amplitude in the [0.0, 1.0] range.
-  const float amplitude = aIntensity > 1.0 ? 1.0 : aIntensity;
-  // Vibration is enabled by specifying the frequency.
-  // Specifying 0.0f will disable the vibration, 0.5f will vibrate at 160Hz,
-  // and 1.0f will vibrate at 320Hz.
-  const float frequency = (duration > 0) ? 1.0f : 0.0f;
-  ovrControllerType hand;
-
-  switch (GetHand()) {
-    case GamepadHand::Left:
-      hand = ovrControllerType::ovrControllerType_LTouch;
-      break;
-    case GamepadHand::Right:
-      hand = ovrControllerType::ovrControllerType_RTouch;
-      break;
-    default:
-      MOZ_ASSERT(false);
-      break;
-  }
-
-  // Oculus Touch only can get the response from ovr_SetControllerVibration()
-  // at the presenting mode.
-  ovrResult result = ovr_SetControllerVibration(aSession, hand, frequency,
-                                                (frequency == 0.0f) ? 0.0f : amplitude);
-  if (result != ovrSuccess) {
-    printf_stderr("%s hand ovr_SetControllerVibration skipped.\n",
-                  GamepadHandValues::strings[uint32_t(GetHand())].value);
-  }
-
-  // In Oculus dev doc, it mentions vibration lasts for a maximum of 2.5 seconds
-  // at ovr_SetControllerVibration(), but we found 2.450 sec is more close to the
-  // real looping use case.
-  const double kVibrateRate = 2450.0;
-  const double remainingTime = (duration > kVibrateRate)
-                                ? (duration - kVibrateRate) : duration;
-
-  if (remainingTime) {
-    MOZ_ASSERT(mVibrateThread);
-
-    RefPtr<Runnable> runnable =
-      NewRunnableMethod<ovrSession, uint32_t, double, double, uint64_t,
-        StoreCopyPassByConstLRef<VRManagerPromise>>(
-          "VRControllerOculus::UpdateVibrateHaptic",
-          this, &VRControllerOculus::UpdateVibrateHaptic, aSession,
-          aHapticIndex, aIntensity, (duration > kVibrateRate) ? remainingTime : 0, aVibrateIndex, aPromise);
-    mVibrateThread->PostDelayedTask(runnable.forget(), (duration > kVibrateRate) ? kVibrateRate : remainingTime);
-  } else {
-    VibrateHapticComplete(aSession, aPromise, true);
-  }
-}
-
-void
-VRControllerOculus::VibrateHapticComplete(ovrSession aSession, const VRManagerPromise& aPromise,
-                                          bool aStop)
-{
-  if (aStop) {
-    ovrControllerType hand;
-
-    switch (GetHand()) {
-      case GamepadHand::Left:
-        hand = ovrControllerType::ovrControllerType_LTouch;
-        break;
-      case GamepadHand::Right:
-        hand = ovrControllerType::ovrControllerType_RTouch;
-        break;
-      default:
-        MOZ_ASSERT(false);
-        break;
-    }
-
-    ovrResult result = ovr_SetControllerVibration(aSession, hand, 0.0f, 0.0f);
-    if (result != ovrSuccess) {
-      printf_stderr("%s Haptics skipped.\n",
-                    GamepadHandValues::strings[uint32_t(GetHand())].value);
-    }
-  }
-
-  VRManager *vm = VRManager::Get();
-  MOZ_ASSERT(vm);
-
-  CompositorThreadHolder::Loop()->PostTask(
-    NewRunnableMethod<StoreCopyPassByConstLRef<VRManagerPromise>>(
-      "VRManager::NotifyVibrateHapticCompleted",
-      vm, &VRManager::NotifyVibrateHapticCompleted, aPromise));
-}
-
-void
-VRControllerOculus::VibrateHaptic(ovrSession aSession,
-                                  uint32_t aHapticIndex,
-                                  double aIntensity,
-                                  double aDuration,
-                                  const VRManagerPromise& aPromise)
-{
-  // Spinning up the haptics thread at the first haptics call.
-  if (!mVibrateThread) {
-    mVibrateThread = new VRThread(NS_LITERAL_CSTRING("Oculus_Vibration"));
-  }
-  mVibrateThread->Start();
-  ++mVibrateIndex;
-  mIsVibrateStopped = false;
-
-  RefPtr<Runnable> runnable =
-    NewRunnableMethod<ovrSession, uint32_t, double, double, uint64_t,
-      StoreCopyPassByConstLRef<VRManagerPromise>>(
-        "VRControllerOculus::UpdateVibrateHaptic",
-        this, &VRControllerOculus::UpdateVibrateHaptic, aSession,
-        aHapticIndex, aIntensity, aDuration, mVibrateIndex, aPromise);
-  mVibrateThread->PostTask(runnable.forget());
-}
-
-void
-VRControllerOculus::StopVibrateHaptic()
-{
-  mIsVibrateStopped = true;
-}
-
-void
-VRControllerOculus::ShutdownVibrateHapticThread()
-{
-  StopVibrateHaptic();
-  if (mVibrateThread) {
-    mVibrateThread->Shutdown();
-    mVibrateThread = nullptr;
-  }
-}
-
-/*static*/ already_AddRefed<VRSystemManagerOculus>
-VRSystemManagerOculus::Create()
-{
-  MOZ_ASSERT(NS_IsMainThread());
-
-  if (!gfxPrefs::VREnabled() || !gfxPrefs::VROculusEnabled())
-  {
-    return nullptr;
-  }
-
-  RefPtr<VRSystemManagerOculus> manager = new VRSystemManagerOculus();
-  return manager.forget();
-}
-
-VRSystemManagerOculus::VRSystemManagerOculus()
-  : mSession(nullptr)
-{
-}
-
-void
-VRSystemManagerOculus::Destroy()
-{
-  Shutdown();
-  mSession = nullptr;
-}
-
-void
-VRSystemManagerOculus::Shutdown()
-{
-  if (mSession) {
-    mSession->StopTracking();
-  }
-  RemoveControllers();
-  if (mDisplay) {
-    mDisplay->Destroy();
-  }
-  mDisplay = nullptr;
-}
-
-void
-VRSystemManagerOculus::NotifyVSync()
-{
-  VRSystemManager::NotifyVSync();
-  if (!mSession) {
-    return;
-  }
-  mSession->Refresh();
-  if (mDisplay) {
-    mDisplay->Refresh();
-  }
-  // Detect disconnection
-  if (!mSession->IsTrackingReady()) {
-    // No HMD connected
-    mDisplay = nullptr;
-    // Prevent enumeration from continuously running
-    // after the headset is disconnected.
-    mSession->StopTracking();
-  }
-}
-
-bool
-VRSystemManagerOculus::ShouldInhibitEnumeration()
-{
-  if (VRSystemManager::ShouldInhibitEnumeration()) {
-    return true;
-  }
-  if (mDisplay) {
-    // When we find an Oculus VR device, don't
-    // allow any further enumeration as it
-    // may get picked up redundantly by other
-    // API's such as OpenVR.
-    return true;
-  }
-  if (mSession && mSession->IsQuitTimeoutActive()) {
-    // When we are responding to ShouldQuit, we return true here
-    // to prevent further enumeration by other VRSystemManager's such as
-    // VRSystemManagerOpenVR which would also enumerate the connected Oculus
-    // HMD, resulting in interference with the Oculus runtime software updates.
-    return true;
-  }
-  return false;
-}
-
-void
-VRSystemManagerOculus::Enumerate()
-{
-  if (!mSession) {
-    mSession = new VROculusSession();
-  }
-  mSession->StartTracking();
-  if (mDisplay == nullptr && mSession->IsTrackingReady()) {
-    // HMD Detected
-    mDisplay = new VRDisplayOculus(mSession);
-  }
-  if (mDisplay == nullptr) {
-    // Prevent enumeration from continuously running
-    // when a headset was not found.
-    mSession->StopTracking();
-  }
-}
-
-void
-VRSystemManagerOculus::GetHMDs(nsTArray<RefPtr<VRDisplayHost>>& aHMDResult)
-{
-  if (mDisplay) {
-    aHMDResult.AppendElement(mDisplay);
-  }
-}
-
-bool
-VRSystemManagerOculus::GetIsPresenting()
-{
-  if (mDisplay) {
-    VRDisplayInfo displayInfo(mDisplay->GetDisplayInfo());
-    return displayInfo.GetPresentingGroups() != 0;
-  }
-
-  return false;
-}
-
-void
-VRSystemManagerOculus::HandleInput()
-{
-  // The session is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mSession || !mSession->IsTrackingReady()) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOculus> controller;
-  ovrInputState inputState;
-  uint32_t axis = 0;
-  const bool hasInputState = ovr_GetInputState(mSession->Get(), ovrControllerType_Touch,
-                                               &inputState) == ovrSuccess;
-
-  if (!hasInputState) {
-    return;
-  }
-
-  for (uint32_t i = 0; i < mOculusController.Length(); ++i) {
-    controller = mOculusController[i];
-    const GamepadHand hand = controller->GetHand();
-    const uint32_t handIdx = static_cast<uint32_t>(hand) - 1;
-    uint32_t buttonIdx = 0;
-    ovrHandType oculusHandType;
-
-    switch (hand) {
-      case dom::GamepadHand::Left:
-        oculusHandType = ovrHand_Left;
-        HandleButtonPress(i, buttonIdx, ovrButton_LThumb, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleIndexTriggerPress(i, buttonIdx, inputState.IndexTrigger[handIdx], ovrTouch_LIndexTrigger, inputState.Touches);
-        ++buttonIdx;
-        HandleHandTriggerPress(i, buttonIdx, inputState.HandTrigger[handIdx]);
-        ++buttonIdx;
-        HandleButtonPress(i, buttonIdx, ovrButton_X, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleButtonPress(i, buttonIdx, ovrButton_Y, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleTouchEvent(i, buttonIdx, ovrTouch_LThumbRest, inputState.Touches);
-        ++buttonIdx;
-        break;
-      case dom::GamepadHand::Right:
-        oculusHandType = ovrHand_Right;
-        HandleButtonPress(i, buttonIdx, ovrButton_RThumb, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleIndexTriggerPress(i, buttonIdx, inputState.IndexTrigger[handIdx], ovrTouch_RIndexTrigger, inputState.Touches);
-        ++buttonIdx;
-        HandleHandTriggerPress(i, buttonIdx, inputState.HandTrigger[handIdx]);
-        ++buttonIdx;
-        HandleButtonPress(i, buttonIdx, ovrButton_A, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleButtonPress(i, buttonIdx, ovrButton_B, inputState.Buttons,
-                          inputState.Touches);
-        ++buttonIdx;
-        HandleTouchEvent(i, buttonIdx, ovrTouch_RThumbRest, inputState.Touches);
-        ++buttonIdx;
-        break;
-      default:
-        MOZ_ASSERT(false);
-        break;
-    }
-    controller->SetButtonPressed(inputState.Buttons);
-    controller->SetButtonTouched(inputState.Touches);
-
-    axis = static_cast<uint32_t>(OculusControllerAxisType::ThumbstickXAxis);
-    HandleAxisMove(i, axis, inputState.Thumbstick[oculusHandType].x);
-
-    axis = static_cast<uint32_t>(OculusControllerAxisType::ThumbstickYAxis);
-    HandleAxisMove(i, axis, -inputState.Thumbstick[oculusHandType].y);
-
-    // Process pose state.
-    GamepadPoseState poseState;
-    GetControllerPoseState(handIdx, poseState);
-    HandlePoseTracking(i, poseState, controller);
-  }
-}
-
-void
-VRSystemManagerOculus::GetControllerPoseState(uint32_t aHandIdx, GamepadPoseState& aPoseState,
-                                              bool aForceUpdate)
-{
-    ovrTrackingState state = ovr_GetTrackingState(mSession->Get(), 0.0, false);
-
-    // HandPoses is ordered by ovrControllerType_LTouch and ovrControllerType_RTouch,
-    // therefore, we can't get its state by the index of mOculusController.
-    ovrPoseStatef& pose(state.HandPoses[aHandIdx]);
-
-    if (aForceUpdate || state.HandStatusFlags[aHandIdx] & ovrStatus_OrientationTracked) {
-      aPoseState.flags |= GamepadCapabilityFlags::Cap_Orientation;
-      aPoseState.orientation[0] = pose.ThePose.Orientation.x;
-      aPoseState.orientation[1] = pose.ThePose.Orientation.y;
-      aPoseState.orientation[2] = pose.ThePose.Orientation.z;
-      aPoseState.orientation[3] = pose.ThePose.Orientation.w;
-      aPoseState.angularVelocity[0] = pose.AngularVelocity.x;
-      aPoseState.angularVelocity[1] = pose.AngularVelocity.y;
-      aPoseState.angularVelocity[2] = pose.AngularVelocity.z;
-
-      aPoseState.flags |= GamepadCapabilityFlags::Cap_AngularAcceleration;
-      aPoseState.angularAcceleration[0] = pose.AngularAcceleration.x;
-      aPoseState.angularAcceleration[1] = pose.AngularAcceleration.y;
-      aPoseState.angularAcceleration[2] = pose.AngularAcceleration.z;
-      aPoseState.isOrientationValid = true;
-    }
-    if (aForceUpdate || state.HandStatusFlags[aHandIdx] & ovrStatus_PositionTracked) {
-      aPoseState.flags |= GamepadCapabilityFlags::Cap_Position;
-      aPoseState.position[0] = pose.ThePose.Position.x;
-      aPoseState.position[1] = pose.ThePose.Position.y;
-      aPoseState.position[2] = pose.ThePose.Position.z;
-      aPoseState.linearVelocity[0] = pose.LinearVelocity.x;
-      aPoseState.linearVelocity[1] = pose.LinearVelocity.y;
-      aPoseState.linearVelocity[2] = pose.LinearVelocity.z;
-
-      aPoseState.flags |= GamepadCapabilityFlags::Cap_LinearAcceleration;
-      aPoseState.linearAcceleration[0] = pose.LinearAcceleration.x;
-      aPoseState.linearAcceleration[1] = pose.LinearAcceleration.y;
-      aPoseState.linearAcceleration[2] = pose.LinearAcceleration.z;
-
-      float eyeHeight = ovr_GetFloat(mSession->Get(), OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT);
-      aPoseState.position[1] -= eyeHeight;
-      aPoseState.isPositionValid = true;
-    }
-}
-
-void
-VRSystemManagerOculus::HandleButtonPress(uint32_t aControllerIdx,
-                                         uint32_t aButton,
-                                         uint64_t aButtonMask,
-                                         uint64_t aButtonPressed,
-                                         uint64_t aButtonTouched)
-{
-  RefPtr<impl::VRControllerOculus> controller(mOculusController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  const uint64_t pressedDiff = (controller->GetButtonPressed() ^ aButtonPressed);
-  const uint64_t touchedDiff = (controller->GetButtonTouched() ^ aButtonTouched);
-
-  if (!pressedDiff && !touchedDiff) {
-    return;
-  }
-
-  if (pressedDiff & aButtonMask ||
-      touchedDiff & aButtonMask) {
-    // diff & (aButtonPressed, aButtonTouched) would be true while a new button pressed or
-    // touched event, otherwise it is an old event and needs to notify
-    // the button has been released.
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("Oculus handleButton(aButton = %d, length = %d, controller: %s.)",
-                              aButton,
-                              controller->GetControllerInfo().GetNumButtons(),
-                              controller->GetControllerInfo().GetControllerName());
-    }
-    NewButtonEvent(aControllerIdx, aButton, aButtonMask & aButtonPressed,
-                   aButtonMask & aButtonTouched,
-                   (aButtonMask & aButtonPressed) ? 1.0L : 0.0L);
-  }
-}
-
-void
-VRSystemManagerOculus::HandleIndexTriggerPress(uint32_t aControllerIdx,
-                                               uint32_t aButton,
-                                               float aValue,
-                                               uint64_t aTouchMask,
-                                               uint64_t aButtonTouched)
-{
-  RefPtr<impl::VRControllerOculus> controller(mOculusController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-
-  const uint64_t touchedDiff = (controller->GetButtonTouched() ^ aButtonTouched);
-  const float oldValue = controller->GetIndexTrigger();
-  // We prefer to let developers to set their own threshold for the adjustment.
-  // Therefore, we don't check ButtonPressed and ButtonTouched with TouchMask here.
-  // we just check the button value is larger than the threshold value or not.
-  const float threshold = gfxPrefs::VRControllerTriggerThreshold();
-
-  // Avoid sending duplicated events in IPC channels.
-  if (oldValue != aValue ||
-      touchedDiff & aTouchMask) {
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("Oculus handleIndexTrigger(aButton = %d, length = %d, controller: %s.)",
-                              aButton,
-                              controller->GetControllerInfo().GetNumButtons(),
-                              controller->GetControllerInfo().GetControllerName());
-    }
-    NewButtonEvent(aControllerIdx, aButton, aValue > threshold,
-                   aButtonTouched & aTouchMask, aValue);
-    controller->SetIndexTrigger(aValue);
-  }
-}
-
-void
-VRSystemManagerOculus::HandleHandTriggerPress(uint32_t aControllerIdx,
-                                              uint32_t aButton,
-                                              float aValue)
-{
-  RefPtr<impl::VRControllerOculus> controller(mOculusController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  const float oldValue = controller->GetHandTrigger();
-  // We prefer to let developers to set their own threshold for the adjustment.
-  // Therefore, we don't check ButtonPressed and ButtonTouched with TouchMask here.
-  // we just check the button value is larger than the threshold value or not.
-  const float threshold = gfxPrefs::VRControllerTriggerThreshold();
-
-  // Avoid sending duplicated events in IPC channels.
-  if (oldValue != aValue) {
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("Oculus handleHandTrigger(aButton = %d, length = %d, controller: %s.)",
-                              aButton,
-                              controller->GetControllerInfo().GetNumButtons(),
-                              controller->GetControllerInfo().GetControllerName());
-    }
-    NewButtonEvent(aControllerIdx, aButton, aValue > threshold,
-                   aValue > threshold, aValue);
-    controller->SetHandTrigger(aValue);
-  }
-}
-
-void
-VRSystemManagerOculus::HandleTouchEvent(uint32_t aControllerIdx, uint32_t aButton,
-                                        uint64_t aTouchMask, uint64_t aButtonTouched)
-{
-  RefPtr<impl::VRControllerOculus> controller(mOculusController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  const uint64_t touchedDiff = (controller->GetButtonTouched() ^ aButtonTouched);
-
-  if (touchedDiff & aTouchMask) {
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("Oculus HandleTouchEvent(aButton = %d, length = %d, controller: %s.)",
-                               aButton,
-                               controller->GetControllerInfo().GetNumButtons(),
-                               controller->GetControllerInfo().GetControllerName());
-    }
-    NewButtonEvent(aControllerIdx, aButton, false, aTouchMask & aButtonTouched, 0.0f);
-  }
-}
-
-void
-VRSystemManagerOculus::HandleAxisMove(uint32_t aControllerIdx, uint32_t aAxis,
-                                      float aValue)
-{
-  RefPtr<impl::VRControllerOculus> controller(mOculusController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  float value = aValue;
-
-  if (abs(aValue) < 0.0000009f) {
-    value = 0.0f; // Clear noise signal
-  }
-
-  if (controller->GetAxisMove(aAxis) != value) {
-    if (MOZ_UNLIKELY(aAxis >= controller->GetControllerInfo().GetNumAxes())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("Oculus HandleAxisMove(aAxis = %d, length = %d, controller: %s.)",
-                               aAxis,
-                               controller->GetControllerInfo().GetNumAxes(),
-                               controller->GetControllerInfo().GetControllerName());
-    }
-    NewAxisMove(aControllerIdx, aAxis, value);
-    controller->SetAxisMove(aAxis, value);
-  }
-}
-
-void
-VRSystemManagerOculus::HandlePoseTracking(uint32_t aControllerIdx,
-                                          const GamepadPoseState& aPose,
-                                          VRControllerHost* aController)
-{
-  MOZ_ASSERT(aController);
-  if (aPose != aController->GetPose()) {
-    aController->SetPose(aPose);
-    NewPoseState(aControllerIdx, aPose);
-  }
-}
-
-void
-VRSystemManagerOculus::VibrateHaptic(uint32_t aControllerIdx,
-                                     uint32_t aHapticIndex,
-                                     double aIntensity,
-                                     double aDuration,
-                                     const VRManagerPromise& aPromise)
-{
-  // The session is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mSession || !mSession->IsTrackingReady() ||
-      (aControllerIdx >= mOculusController.Length())) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOculus> controller = mOculusController[aControllerIdx];
-  MOZ_ASSERT(controller);
-
-  controller->VibrateHaptic(mSession->Get(), aHapticIndex, aIntensity, aDuration, aPromise);
-}
-
-void
-VRSystemManagerOculus::StopVibrateHaptic(uint32_t aControllerIdx)
-{
-  // The session is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mSession || !mSession->IsTrackingReady() ||
-      (aControllerIdx >= mOculusController.Length())) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOculus> controller = mOculusController[aControllerIdx];
-  MOZ_ASSERT(controller);
-
-  controller->StopVibrateHaptic();
-}
-
-void
-VRSystemManagerOculus::GetControllers(nsTArray<RefPtr<VRControllerHost>>&
-                                      aControllerResult)
-{
-  aControllerResult.Clear();
-  for (uint32_t i = 0; i < mOculusController.Length(); ++i) {
-    aControllerResult.AppendElement(mOculusController[i]);
-  }
-}
-
-void
-VRSystemManagerOculus::ScanForControllers()
-{
-  // mSession is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mSession || !mSession->IsTrackingReady()) {
-    return;
-  }
-
-  ovrInputState inputState;
-  bool hasInputState = ovr_GetInputState(mSession->Get(), ovrControllerType_Touch,
-                                         &inputState) == ovrSuccess;
-
-  if (!hasInputState) {
-    return;
-  }
-
-  ovrControllerType activeControllerArray[2];
-  uint32_t newControllerCount = 0;
-
-  if (inputState.ControllerType & ovrControllerType_LTouch) {
-    activeControllerArray[newControllerCount] = ovrControllerType_LTouch;
-    ++newControllerCount;
-  }
-
-  if (inputState.ControllerType & ovrControllerType_RTouch) {
-    activeControllerArray[newControllerCount] = ovrControllerType_RTouch;
-    ++newControllerCount;
-  }
-
-  if (newControllerCount != mControllerCount) {
-    RemoveControllers();
-
-    // Re-adding controllers to VRControllerManager.
-    for (uint32_t i = 0; i < newControllerCount; ++i) {
-      GamepadHand hand;
-
-      switch (activeControllerArray[i]) {
-        case ovrControllerType::ovrControllerType_LTouch:
-          hand = GamepadHand::Left;
-          break;
-        case ovrControllerType::ovrControllerType_RTouch:
-          hand = GamepadHand::Right;
-          break;
-        default:
-          continue;
-      }
-      RefPtr<VRControllerOculus> oculusController = new VRControllerOculus(hand,
-                                                      mDisplay->GetDisplayInfo().GetDisplayID());
-      mOculusController.AppendElement(oculusController);
-
-      // Not already present, add it.
-      AddGamepad(oculusController->GetControllerInfo());
-
-      // Process pose state.
-      // We wanna Oculus Touch has the right position when it shows up,
-      // so we force to update the pose no matter if it has OrientationTracked
-      // or PositionTracked.
-      const uint32_t handIdx = static_cast<uint32_t>(hand) - 1;
-      GamepadPoseState poseState;
-      GetControllerPoseState(handIdx, poseState, true);
-      HandlePoseTracking(i, poseState, oculusController);
-
-      ++mControllerCount;
-    }
-  }
-}
-
-void
-VRSystemManagerOculus::RemoveControllers()
-{
-  // controller count is changed, removing the existing gamepads first.
-  for (uint32_t i = 0; i < mOculusController.Length(); ++i) {
-    mOculusController[i]->ShutdownVibrateHapticThread();
-    RemoveGamepad(i);
-  }
-
-  mOculusController.Clear();
-  mControllerCount = 0;
-}
deleted file mode 100644
--- a/gfx/vr/gfxVROculus.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/* -*- 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_OCULUS_H
-#define GFX_VR_OCULUS_H
-
-#include "nsTArray.h"
-#include "nsISupportsImpl.h" // For NS_INLINE_DECL_REFCOUNTING
-#include "mozilla/RefPtr.h"
-
-#include "mozilla/gfx/2D.h"
-#include "mozilla/EnumeratedArray.h"
-
-#include "gfxVR.h"
-#include "VRDisplayLocal.h"
-#include "ovr_capi_dynamic.h"
-
-struct ID3D11Device;
-
-namespace mozilla {
-namespace layers {
-class CompositingRenderTargetD3D11;
-struct VertexShaderConstants;
-struct PixelShaderConstants;
-}
-namespace gfx {
-class VRThread;
-
-namespace impl {
-
-enum class OculusControllerAxisType : uint16_t {
-  ThumbstickXAxis,
-  ThumbstickYAxis,
-  NumVRControllerAxisType
-};
-
-class VROculusSession
-{
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VROculusSession);
-  friend class VRDisplayOculus;
-public:
-  VROculusSession();
-  void Refresh(bool aForceRefresh = false);
-  void StartTracking();
-  void StopTracking();
-  bool IsTrackingReady() const;
-  void StartPresentation(const IntSize& aSize);
-  void StopPresentation();
-  bool IsPresentationReady() const;
-  bool IsMounted() const;
-  ovrSession Get();
-  bool IsQuitTimeoutActive();
-  already_AddRefed<layers::CompositingRenderTargetD3D11> GetNextRenderTarget();
-  ovrTextureSwapChain GetSwapChain();
-
-private:
-  PRLibrary* mOvrLib;
-  ovrSession mSession;
-  ovrInitFlags mInitFlags;
-  ovrTextureSwapChain mTextureSet;
-  nsTArray<RefPtr<layers::CompositingRenderTargetD3D11>> mRenderTargets;
-  IntSize mPresentationSize;
-  RefPtr<ID3D11Device> mDevice;
-  RefPtr<VRThread> mSubmitThread;
-  // The timestamp of the last time Oculus set ShouldQuit to true.
-  TimeStamp mLastShouldQuit;
-  // The timestamp of the last ending presentation
-  TimeStamp mLastPresentationEnd;
-  VRTelemetry mTelemetry;
-  bool mRequestPresentation;
-  bool mRequestTracking;
-  bool mDrawBlack;
-  bool mIsConnected;
-  bool mIsMounted;
-
-  ~VROculusSession();
-  void Uninitialize();
-  bool Initialize(ovrInitFlags aFlags);
-  bool LoadOvrLib();
-  void UnloadOvrLib();
-  bool StartSession();
-  void StopSession();
-  bool StartLib(ovrInitFlags aFlags);
-  void StopLib();
-  bool StartRendering();
-  void StopRendering();
-};
-
-class VRDisplayOculus : public VRDisplayLocal
-{
-public:
-  void ZeroSensor() override;
-
-protected:
-  virtual VRHMDSensorState GetSensorState() override;
-  virtual void StartPresentation() override;
-  virtual void StopPresentation() override;
-  virtual bool SubmitFrame(ID3D11Texture2D* aSource,
-                           const IntSize& aSize,
-                           const gfx::Rect& aLeftEyeRect,
-                           const gfx::Rect& aRightEyeRect) override;
-  void UpdateStageParameters();
-
-public:
-  explicit VRDisplayOculus(VROculusSession* aSession);
-  void Destroy();
-  void Refresh();
-
-protected:
-  virtual ~VRDisplayOculus();
-
-  VRHMDSensorState GetSensorState(double absTime);
-
-  ovrHmdDesc mDesc;
-  RefPtr<VROculusSession> mSession;
-  ovrFovPort mFOVPort[2];
-
-  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;
-
-  float mEyeHeight;
-
-  bool UpdateConstantBuffers();
-  void UpdateEyeParameters(gfx::Matrix4x4* aHeadToEyeTransforms = nullptr);
-
-  struct Vertex
-  {
-    float position[2];
-  };
-};
-
-class VRControllerOculus : public VRControllerHost
-{
-public:
-  explicit VRControllerOculus(dom::GamepadHand aHand, uint32_t aDisplayID);
-  float GetAxisMove(uint32_t aAxis);
-  void SetAxisMove(uint32_t aAxis, float aValue);
-  float GetIndexTrigger();
-  void SetIndexTrigger(float aValue);
-  float GetHandTrigger();
-  void SetHandTrigger(float aValue);
-  void VibrateHaptic(ovrSession aSession,
-                     uint32_t aHapticIndex,
-                     double aIntensity,
-                     double aDuration,
-                     const VRManagerPromise& aPromise);
-  void StopVibrateHaptic();
-  void ShutdownVibrateHapticThread();
-
-protected:
-  virtual ~VRControllerOculus();
-
-private:
-  void UpdateVibrateHaptic(ovrSession aSession,
-                           uint32_t aHapticIndex,
-                           double aIntensity,
-                           double aDuration,
-                           uint64_t aVibrateIndex,
-                           const VRManagerPromise& aPromise);
-  void VibrateHapticComplete(ovrSession aSession, const VRManagerPromise& aPromise, bool aStop);
-
-  float mAxisMove[static_cast<uint32_t>(
-                  OculusControllerAxisType::NumVRControllerAxisType)];
-  float mIndexTrigger;
-  float mHandTrigger;
-  RefPtr<VRThread> mVibrateThread;
-  Atomic<bool> mIsVibrateStopped;
-};
-
-} // namespace impl
-
-class VRSystemManagerOculus : public VRSystemManager
-{
-public:
-  static already_AddRefed<VRSystemManagerOculus> Create();
-  virtual void Destroy() override;
-  virtual void Shutdown() override;
-  virtual void Enumerate() override;
-  virtual void NotifyVSync() override;
-  virtual bool ShouldInhibitEnumeration() 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, const VRManagerPromise& aPromise) override;
-  virtual void StopVibrateHaptic(uint32_t aControllerIdx) override;
-
-protected:
-  VRSystemManagerOculus();
-
-private:
-  void HandleButtonPress(uint32_t aControllerIdx,
-                         uint32_t aButton,
-                         uint64_t aButtonMask,
-                         uint64_t aButtonPressed,
-                         uint64_t aButtonTouched);
-  void HandleAxisMove(uint32_t aControllerIdx, uint32_t aAxis,
-                      float aValue);
-  void HandlePoseTracking(uint32_t aControllerIdx,
-                          const dom::GamepadPoseState& aPose,
-                          VRControllerHost* aController);
-  void HandleIndexTriggerPress(uint32_t aControllerIdx, uint32_t aButton, float aValue,
-                               uint64_t aTouchMask, uint64_t aButtonTouched);
-  void HandleHandTriggerPress(uint32_t aControllerIdx, uint32_t aButton, float aValue);
-  void HandleTouchEvent(uint32_t aControllerIdx, uint32_t aButton,
-                        uint64_t aTouchMask, uint64_t aTouched);
-  void GetControllerPoseState(uint32_t aHandIdx, dom::GamepadPoseState& aPoseState,
-                              bool aForceUpdate = false);
-
-  RefPtr<impl::VRDisplayOculus> mDisplay;
-  nsTArray<RefPtr<impl::VRControllerOculus>> mOculusController;
-  RefPtr<impl::VROculusSession> mSession;
-};
-
-} // namespace gfx
-} // namespace mozilla
-
-#endif /* GFX_VR_OCULUS_H */
deleted file mode 100644
--- a/gfx/vr/gfxVROpenVR.cpp
+++ /dev/null
@@ -1,1349 +0,0 @@
-/* -*- 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/. */
-
-#include <math.h>
-
-#include "prlink.h"
-#include "prenv.h"
-#include "gfxPrefs.h"
-#include "mozilla/Preferences.h"
-
-#include "mozilla/gfx/Quaternion.h"
-
-#ifdef XP_WIN
-#include "CompositorD3D11.h"
-#include "TextureD3D11.h"
-#elif defined(XP_MACOSX)
-#include "mozilla/gfx/MacIOSurface.h"
-#endif
-
-#include "gfxVROpenVR.h"
-#include "VRManagerParent.h"
-#include "VRManager.h"
-#include "VRThread.h"
-
-#include "nsServiceManagerUtils.h"
-#include "nsIScreenManager.h"
-
-#include "mozilla/dom/GamepadEventTypes.h"
-#include "mozilla/dom/GamepadBinding.h"
-#include "mozilla/Telemetry.h"
-
-#ifndef M_PI
-# define M_PI 3.14159265358979323846
-#endif
-
-using namespace mozilla;
-using namespace mozilla::gfx;
-using namespace mozilla::gfx::impl;
-using namespace mozilla::layers;
-using namespace mozilla::dom;
-
-#define BTN_MASK_FROM_ID(_id) \
-  ::vr::ButtonMaskFromId(vr::EVRButtonId::_id)
-
-static const uint32_t kNumOpenVRHaptcs = 1;
-
-VRDisplayOpenVR::VRDisplayOpenVR(::vr::IVRSystem *aVRSystem,
-                                 ::vr::IVRChaperone *aVRChaperone,
-                                 ::vr::IVRCompositor *aVRCompositor)
-  : VRDisplayLocal(VRDeviceType::OpenVR)
-  , mVRSystem(aVRSystem)
-  , mVRChaperone(aVRChaperone)
-  , mVRCompositor(aVRCompositor)
-  , mIsPresenting(false)
-{
-  MOZ_COUNT_CTOR_INHERITED(VRDisplayOpenVR, VRDisplayLocal);
-
-  VRDisplayState& state = mDisplayInfo.mDisplayState;
-
-  strncpy(state.mDisplayName, "OpenVR HMD", kVRDisplayNameMaxLen);
-  state.mIsConnected = mVRSystem->IsTrackedDeviceConnected(::vr::k_unTrackedDeviceIndex_Hmd);
-  state.mIsMounted = false;
-  state.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None |
-                           VRDisplayCapabilityFlags::Cap_Orientation |
-                           VRDisplayCapabilityFlags::Cap_Position |
-                           VRDisplayCapabilityFlags::Cap_External |
-                           VRDisplayCapabilityFlags::Cap_Present |
-                           VRDisplayCapabilityFlags::Cap_StageParameters;
-  mIsHmdPresent = ::vr::VR_IsHmdPresent();
-
-  ::vr::ETrackedPropertyError err;
-  bool bHasProximitySensor = mVRSystem->GetBoolTrackedDeviceProperty(::vr::k_unTrackedDeviceIndex_Hmd, ::vr::Prop_ContainsProximitySensor_Bool, &err);
-  if (err == ::vr::TrackedProp_Success && bHasProximitySensor) {
-    state.mCapabilityFlags |= VRDisplayCapabilityFlags::Cap_MountDetection;
-  }
-
-  mVRCompositor->SetTrackingSpace(::vr::TrackingUniverseSeated);
-
-  uint32_t w, h;
-  mVRSystem->GetRecommendedRenderTargetSize(&w, &h);
-  state.mEyeResolution.width = w;
-  state.mEyeResolution.height = h;
-
-  // SteamVR gives the application a single FOV to use; it's not configurable as with Oculus
-  for (uint32_t eye = 0; eye < 2; ++eye) {
-    // get l/r/t/b clip plane coordinates
-    float l, r, t, b;
-    mVRSystem->GetProjectionRaw(static_cast<::vr::Hmd_Eye>(eye), &l, &r, &t, &b);
-    state.mEyeFOV[eye].SetFromTanRadians(-t, r, b, -l);
-  }
-  UpdateEyeParameters();
-  UpdateStageParameters();
-}
-
-VRDisplayOpenVR::~VRDisplayOpenVR()
-{
-  Destroy();
-  MOZ_COUNT_DTOR_INHERITED(VRDisplayOpenVR, VRDisplayLocal);
-}
-
-void
-VRDisplayOpenVR::Destroy()
-{
-  StopPresentation();
-  ::vr::VR_Shutdown();
-}
-
-void
-VRDisplayOpenVR::UpdateEyeParameters(gfx::Matrix4x4* aHeadToEyeTransforms /* = nullptr */)
-{
-  // Note this must be called every frame, as the IPD adjustment can be changed
-  // by the user during a VR session.
-  for (uint32_t eye = 0; eye < VRDisplayState::NumEyes; eye++) {
-    ::vr::HmdMatrix34_t eyeToHead = mVRSystem->GetEyeToHeadTransform(static_cast<::vr::Hmd_Eye>(eye));
-
-    mDisplayInfo.mDisplayState.mEyeTranslation[eye].x = eyeToHead.m[0][3];
-    mDisplayInfo.mDisplayState.mEyeTranslation[eye].y = eyeToHead.m[1][3];
-    mDisplayInfo.mDisplayState.mEyeTranslation[eye].z = eyeToHead.m[2][3];
-
-    if (aHeadToEyeTransforms) {
-      Matrix4x4 pose;
-      // NOTE! eyeToHead.m is a 3x4 matrix, not 4x4.  But
-      // because of its arrangement, we can copy the 12 elements in and
-      // then transpose them to the right place.
-      memcpy(&pose._11, &eyeToHead.m, sizeof(eyeToHead.m));
-      pose.Transpose();
-      pose.Invert();
-      aHeadToEyeTransforms[eye] = pose;
-    }
-  }
-}
-
-void
-VRDisplayOpenVR::UpdateStageParameters()
-{
-  VRDisplayState& state = mDisplayInfo.mDisplayState;
-  float sizeX = 0.0f;
-  float sizeZ = 0.0f;
-  if (mVRChaperone->GetPlayAreaSize(&sizeX, &sizeZ)) {
-    ::vr::HmdMatrix34_t t = mVRSystem->GetSeatedZeroPoseToStandingAbsoluteTrackingPose();
-    state.mStageSize.width = sizeX;
-    state.mStageSize.height = sizeZ;
-
-    state.mSittingToStandingTransform[0] = t.m[0][0];
-    state.mSittingToStandingTransform[1] = t.m[1][0];
-    state.mSittingToStandingTransform[2] = t.m[2][0];
-    state.mSittingToStandingTransform[3] = 0.0f;
-
-    state.mSittingToStandingTransform[4] = t.m[0][1];
-    state.mSittingToStandingTransform[5] = t.m[1][1];
-    state.mSittingToStandingTransform[6] = t.m[2][1];
-    state.mSittingToStandingTransform[7] = 0.0f;
-
-    state.mSittingToStandingTransform[8] = t.m[0][2];
-    state.mSittingToStandingTransform[9] = t.m[1][2];
-    state.mSittingToStandingTransform[10] = t.m[2][2];
-    state.mSittingToStandingTransform[11] = 0.0f;
-
-    state.mSittingToStandingTransform[12] = t.m[0][3];
-    state.mSittingToStandingTransform[13] = t.m[1][3];
-    state.mSittingToStandingTransform[14] = t.m[2][3];
-    state.mSittingToStandingTransform[15] = 1.0f;
-  } else {
-    // If we fail, fall back to reasonable defaults.
-    // 1m x 1m space, 0.75m high in seated position
-
-    state.mStageSize.width = 1.0f;
-    state.mStageSize.height = 1.0f;
-
-    state.mSittingToStandingTransform[0] = 1.0f;
-    state.mSittingToStandingTransform[1] = 0.0f;
-    state.mSittingToStandingTransform[2] = 0.0f;
-    state.mSittingToStandingTransform[3] = 0.0f;
-
-    state.mSittingToStandingTransform[4] = 0.0f;
-    state.mSittingToStandingTransform[5] = 1.0f;
-    state.mSittingToStandingTransform[6] = 0.0f;
-    state.mSittingToStandingTransform[7] = 0.0f;
-
-    state.mSittingToStandingTransform[8] = 0.0f;
-    state.mSittingToStandingTransform[9] = 0.0f;
-    state.mSittingToStandingTransform[10] = 1.0f;
-    state.mSittingToStandingTransform[11] = 0.0f;
-
-    state.mSittingToStandingTransform[12] = 0.0f;
-    state.mSittingToStandingTransform[13] = 0.75f;
-    state.mSittingToStandingTransform[14] = 0.0f;
-    state.mSittingToStandingTransform[15] = 1.0f;
-  }
-}
-
-void
-VRDisplayOpenVR::ZeroSensor()
-{
-  mVRSystem->ResetSeatedZeroPose();
-  UpdateStageParameters();
-}
-
-bool
-VRDisplayOpenVR::GetIsHmdPresent()
-{
-  return mIsHmdPresent;
-}
-
-void
-VRDisplayOpenVR::Refresh()
-{
-  mIsHmdPresent = ::vr::VR_IsHmdPresent();
-
-  ::vr::VREvent_t event;
-  while (mVRSystem && mVRSystem->PollNextEvent(&event, sizeof(event))) {
-    switch (event.eventType) {
-      case ::vr::VREvent_TrackedDeviceUserInteractionStarted:
-        if (event.trackedDeviceIndex == ::vr::k_unTrackedDeviceIndex_Hmd) {
-          mDisplayInfo.mDisplayState.mIsMounted = true;
-        }
-        break;
-      case ::vr::VREvent_TrackedDeviceUserInteractionEnded:
-        if (event.trackedDeviceIndex == ::vr::k_unTrackedDeviceIndex_Hmd) {
-          mDisplayInfo.mDisplayState.mIsMounted = false;
-        }
-        break;
-      case ::vr::EVREventType::VREvent_TrackedDeviceActivated:
-        if (event.trackedDeviceIndex == ::vr::k_unTrackedDeviceIndex_Hmd) {
-          mDisplayInfo.mDisplayState.mIsConnected = true;
-        }
-        break;
-      case ::vr::EVREventType::VREvent_TrackedDeviceDeactivated:
-        if (event.trackedDeviceIndex == ::vr::k_unTrackedDeviceIndex_Hmd) {
-          mDisplayInfo.mDisplayState.mIsConnected = false;
-        }
-        break;
-      case ::vr::EVREventType::VREvent_DriverRequestedQuit:
-      case ::vr::EVREventType::VREvent_Quit:
-      case ::vr::EVREventType::VREvent_ProcessQuit:
-      case ::vr::EVREventType::VREvent_QuitAcknowledged:
-      case ::vr::EVREventType::VREvent_QuitAborted_UserPrompt:
-        mIsHmdPresent = false;
-        break;
-      default:
-        // ignore
-        break;
-    }
-  }
-}
-
-VRHMDSensorState
-VRDisplayOpenVR::GetSensorState()
-{
-  const uint32_t posesSize = ::vr::k_unTrackedDeviceIndex_Hmd + 1;
-  ::vr::TrackedDevicePose_t poses[posesSize];
-  // Note: We *must* call WaitGetPoses in order for any rendering to happen at all.
-  mVRCompositor->WaitGetPoses(poses, posesSize, nullptr, 0);
-  gfx::Matrix4x4 headToEyeTransforms[2];
-  UpdateEyeParameters(headToEyeTransforms);
-
-  VRHMDSensorState result{};
-
-  ::vr::Compositor_FrameTiming timing;
-  timing.m_nSize = sizeof(::vr::Compositor_FrameTiming);
-  if (mVRCompositor->GetFrameTiming(&timing)) {
-    result.timestamp = timing.m_flSystemTimeInSeconds;
-  } else {
-    // This should not happen, but log it just in case
-    NS_WARNING("OpenVR - IVRCompositor::GetFrameTiming failed");
-  }
-
-  if (poses[::vr::k_unTrackedDeviceIndex_Hmd].bDeviceIsConnected &&
-      poses[::vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid &&
-      poses[::vr::k_unTrackedDeviceIndex_Hmd].eTrackingResult == ::vr::TrackingResult_Running_OK)
-  {
-    const ::vr::TrackedDevicePose_t& pose = poses[::vr::k_unTrackedDeviceIndex_Hmd];
-
-    gfx::Matrix4x4 m;
-    // NOTE! mDeviceToAbsoluteTracking is a 3x4 matrix, not 4x4.  But
-    // because of its arrangement, we can copy the 12 elements in and
-    // then transpose them to the right place.  We do this so we can
-    // pull out a Quaternion.
-    memcpy(&m._11, &pose.mDeviceToAbsoluteTracking, sizeof(pose.mDeviceToAbsoluteTracking));
-    m.Transpose();
-
-    gfx::Quaternion rot;
-    rot.SetFromRotationMatrix(m);
-    rot.Invert();
-
-    result.flags |= VRDisplayCapabilityFlags::Cap_Orientation;
-    result.pose.orientation[0] = rot.x;
-    result.pose.orientation[1] = rot.y;
-    result.pose.orientation[2] = rot.z;
-    result.pose.orientation[3] = rot.w;
-    result.pose.angularVelocity[0] = pose.vAngularVelocity.v[0];
-    result.pose.angularVelocity[1] = pose.vAngularVelocity.v[1];
-    result.pose.angularVelocity[2] = pose.vAngularVelocity.v[2];
-
-    result.flags |= VRDisplayCapabilityFlags::Cap_Position;
-    result.pose.position[0] = m._41;
-    result.pose.position[1] = m._42;
-    result.pose.position[2] = m._43;
-    result.pose.linearVelocity[0] = pose.vVelocity.v[0];
-    result.pose.linearVelocity[1] = pose.vVelocity.v[1];
-    result.pose.linearVelocity[2] = pose.vVelocity.v[2];
-  } else {
-    // default to an identity quaternion
-    result.pose.orientation[3] = 1.0f;
-  }
-
-  result.CalcViewMatrices(headToEyeTransforms);
-  result.inputFrameID = mDisplayInfo.mFrameId;
-  return result;
-}
-
-void
-VRDisplayOpenVR::StartPresentation()
-{
-  if (mIsPresenting) {
-    return;
-  }
-  mIsPresenting = true;
-  mTelemetry.Clear();
-  mTelemetry.mPresentationStart = TimeStamp::Now();
-
-  ::vr::Compositor_CumulativeStats stats;
-  mVRCompositor->GetCumulativeStats(&stats, sizeof(::vr::Compositor_CumulativeStats));
-  mTelemetry.mLastDroppedFrameCount = stats.m_nNumReprojectedFrames;
-}
-
-void
-VRDisplayOpenVR::StopPresentation()
-{
-  if (!mIsPresenting) {
-    return;
-  }
-
-  mVRCompositor->ClearLastSubmittedFrame();
-
-  mIsPresenting = false;
-  const TimeDuration duration = TimeStamp::Now() - mTelemetry.mPresentationStart;
-  Telemetry::Accumulate(Telemetry::WEBVR_USERS_VIEW_IN, 2);
-  Telemetry::Accumulate(Telemetry::WEBVR_TIME_SPENT_VIEWING_IN_OPENVR,
-                        duration.ToMilliseconds());
-
-  ::vr::Compositor_CumulativeStats stats;
-  mVRCompositor->GetCumulativeStats(&stats, sizeof(::vr::Compositor_CumulativeStats));
-  const uint32_t droppedFramesPerSec = (stats.m_nNumReprojectedFrames -
-                                        mTelemetry.mLastDroppedFrameCount) / duration.ToSeconds();
-  Telemetry::Accumulate(Telemetry::WEBVR_DROPPED_FRAMES_IN_OPENVR, droppedFramesPerSec);
-}
-
-bool
-VRDisplayOpenVR::SubmitFrameOpenVRHandle(void* aTextureHandle,
-                                         ::vr::ETextureType aTextureType,
-                                         const IntSize& aSize,
-                                         const gfx::Rect& aLeftEyeRect,
-                                         const gfx::Rect& aRightEyeRect)
-{
-  MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
-  if (!mIsPresenting) {
-    return false;
-  }
-
-  ::vr::Texture_t tex;
-  tex.handle = aTextureHandle;
-  tex.eType = aTextureType;
-  tex.eColorSpace = ::vr::EColorSpace::ColorSpace_Auto;
-
-  ::vr::VRTextureBounds_t bounds;
-  bounds.uMin = aLeftEyeRect.X();
-  bounds.vMin = 1.0 - aLeftEyeRect.Y();
-  bounds.uMax = aLeftEyeRect.XMost();
-  bounds.vMax = 1.0 - aLeftEyeRect.YMost();
-
-  ::vr::EVRCompositorError err;
-  err = mVRCompositor->Submit(::vr::EVREye::Eye_Left, &tex, &bounds);
-  if (err != ::vr::EVRCompositorError::VRCompositorError_None) {
-    printf_stderr("OpenVR Compositor Submit() failed.\n");
-  }
-
-  bounds.uMin = aRightEyeRect.X();
-  bounds.vMin = 1.0 - aRightEyeRect.Y();
-  bounds.uMax = aRightEyeRect.XMost();
-  bounds.vMax = 1.0 - aRightEyeRect.YMost();
-
-  err = mVRCompositor->Submit(::vr::EVREye::Eye_Right, &tex, &bounds);
-  if (err != ::vr::EVRCompositorError::VRCompositorError_None) {
-    printf_stderr("OpenVR Compositor Submit() failed.\n");
-  }
-
-  mVRCompositor->PostPresentHandoff();
-  return true;
-}
-
-#if defined(XP_WIN)
-
-bool
-VRDisplayOpenVR::SubmitFrame(ID3D11Texture2D* aSource,
-                             const IntSize& aSize,
-                             const gfx::Rect& aLeftEyeRect,
-                             const gfx::Rect& aRightEyeRect)
-{
-  return SubmitFrameOpenVRHandle((void *)aSource,
-                                 ::vr::ETextureType::TextureType_DirectX,
-                                 aSize, aLeftEyeRect, aRightEyeRect);
-}
-
-#elif defined(XP_MACOSX)
-
-bool
-VRDisplayOpenVR::SubmitFrame(MacIOSurface* aMacIOSurface,
-                             const IntSize& aSize,
-                             const gfx::Rect& aLeftEyeRect,
-                             const gfx::Rect& aRightEyeRect)
-{
-  const void* ioSurface = aMacIOSurface->GetIOSurfacePtr();
-  bool result = false;
-  if (ioSurface == nullptr) {
-    NS_WARNING("VRDisplayOpenVR::SubmitFrame() could not get an IOSurface");
-  } else {
-    result = SubmitFrameOpenVRHandle((void *)ioSurface,
-                                     ::vr::ETextureType::TextureType_IOSurface,
-                                     aSize, aLeftEyeRect, aRightEyeRect);
-  }
-  return result;
-}
-
-#endif
-
-VRControllerOpenVR::VRControllerOpenVR(dom::GamepadHand aHand, uint32_t aDisplayID,
-                                       uint32_t aNumButtons, uint32_t aNumTriggers,
-                                       uint32_t aNumAxes, const nsCString& aId)
-  : VRControllerHost(VRDeviceType::OpenVR, aHand, aDisplayID)
-  , mTrackedIndex(0)
-  , mVibrateThread(nullptr)
-  , mIsVibrateStopped(false)
-{
-  MOZ_COUNT_CTOR_INHERITED(VRControllerOpenVR, VRControllerHost);
-
-  VRControllerState& state = mControllerInfo.mControllerState;
-  strncpy(state.controllerName, aId.BeginReading(), kVRControllerNameMaxLen);
-  state.numButtons = aNumButtons;
-  state.numAxes = aNumAxes;
-  state.numHaptics = kNumOpenVRHaptcs;
-}
-
-VRControllerOpenVR::~VRControllerOpenVR()
-{
-  ShutdownVibrateHapticThread();
-  MOZ_COUNT_DTOR_INHERITED(VRControllerOpenVR, VRControllerHost);
-}
-
-void
-VRControllerOpenVR::SetTrackedIndex(uint32_t aTrackedIndex)
-{
-  mTrackedIndex = aTrackedIndex;
-}
-
-uint32_t
-VRControllerOpenVR::GetTrackedIndex()
-{
-  return mTrackedIndex;
-}
-
-float
-VRControllerOpenVR::GetAxisMove(uint32_t aAxis)
-{
-  return mControllerInfo.mControllerState.axisValue[aAxis];
-}
-
-void
-VRControllerOpenVR::SetAxisMove(uint32_t aAxis, float aValue)
-{
-  mControllerInfo.mControllerState.axisValue[aAxis] = aValue;
-}
-
-void
-VRControllerOpenVR::SetTrigger(uint32_t aButton, float aValue)
-{
-  mControllerInfo.mControllerState.triggerValue[aButton] = aValue;
-}
-
-float
-VRControllerOpenVR::GetTrigger(uint32_t aButton)
-{
-  return mControllerInfo.mControllerState.triggerValue[aButton];
-}
-
-void
-VRControllerOpenVR::SetHand(dom::GamepadHand aHand)
-{
-  mControllerInfo.mControllerState.hand = aHand;
-}
-
-void
-VRControllerOpenVR::UpdateVibrateHaptic(::vr::IVRSystem* aVRSystem,
-                                        uint32_t aHapticIndex,
-                                        double aIntensity,
-                                        double aDuration,
-                                        uint64_t aVibrateIndex,
-                                        const VRManagerPromise& aPromise)
-{
-  // UpdateVibrateHaptic() only can be called by mVibrateThread
-  MOZ_ASSERT(mVibrateThread->GetThread() == NS_GetCurrentThread());
-
-  // It has been interrupted by loss focus.
-  if (mIsVibrateStopped) {
-    VibrateHapticComplete(aPromise);
-    return;
-  }
-  // Avoid the previous vibrate event to override the new one.
-  if (mVibrateIndex != aVibrateIndex) {
-    VibrateHapticComplete(aPromise);
-    return;
-  }
-
-  const double duration = (aIntensity == 0) ? 0 : aDuration;
-  // We expect OpenVR to vibrate for 5 ms, but we found it only response the
-  // commend ~ 3.9 ms. For duration time longer than 3.9 ms, we separate them
-  // to a loop of 3.9 ms for make users feel that is a continuous events.
-  const uint32_t microSec = (duration < 3.9 ? duration : 3.9) * 1000 * aIntensity;
-  aVRSystem->TriggerHapticPulse(GetTrackedIndex(),
-                                aHapticIndex, microSec);
-
-  // In OpenVR spec, it mentions TriggerHapticPulse() may not trigger another haptic pulse
-  // on this controller and axis combination for 5ms.
-  const double kVibrateRate = 5.0;
-  if (duration >= kVibrateRate) {
-    MOZ_ASSERT(mVibrateThread);
-    MOZ_ASSERT(mVibrateThread->IsActive());
-
-    RefPtr<Runnable> runnable =
-      NewRunnableMethod<::vr::IVRSystem*, uint32_t, double, double, uint64_t,
-        StoreCopyPassByConstLRef<VRManagerPromise>>(
-          "VRControllerOpenVR::UpdateVibrateHaptic",
-          this, &VRControllerOpenVR::UpdateVibrateHaptic, aVRSystem,
-          aHapticIndex, aIntensity, duration - kVibrateRate, aVibrateIndex, aPromise);
-    mVibrateThread->PostDelayedTask(runnable.forget(), kVibrateRate);
-  } else {
-    // The pulse has completed
-    VibrateHapticComplete(aPromise);
-  }
-}
-
-void
-VRControllerOpenVR::VibrateHapticComplete(const VRManagerPromise& aPromise)
-{
-  VRManager *vm = VRManager::Get();
-  CompositorThreadHolder::Loop()->PostTask(
-    NewRunnableMethod<StoreCopyPassByConstLRef<VRManagerPromise>>(
-      "VRManager::NotifyVibrateHapticCompleted",
-      vm, &VRManager::NotifyVibrateHapticCompleted, aPromise));
-}
-
-void
-VRControllerOpenVR::VibrateHaptic(::vr::IVRSystem* aVRSystem,
-                                  uint32_t aHapticIndex,
-                                  double aIntensity,
-                                  double aDuration,
-                                  const VRManagerPromise& aPromise)
-{
-  // Spinning up the haptics thread at the first haptics call.
-  if (!mVibrateThread) {
-    mVibrateThread = new VRThread(NS_LITERAL_CSTRING("OpenVR_Vibration"));
-  }
-  mVibrateThread->Start();
-  ++mVibrateIndex;
-  mIsVibrateStopped = false;
-
-  RefPtr<Runnable> runnable =
-    NewRunnableMethod<::vr::IVRSystem*, uint32_t, double, double, uint64_t,
-      StoreCopyPassByConstLRef<VRManagerPromise>>(
-        "VRControllerOpenVR::UpdateVibrateHaptic",
-        this, &VRControllerOpenVR::UpdateVibrateHaptic, aVRSystem,
-        aHapticIndex, aIntensity, aDuration, mVibrateIndex, aPromise);
-  mVibrateThread->PostTask(runnable.forget());
-}
-
-void
-VRControllerOpenVR::StopVibrateHaptic()
-{
-  mIsVibrateStopped = true;
-}
-
-void
-VRControllerOpenVR::ShutdownVibrateHapticThread()
-{
-  StopVibrateHaptic();
-  if (mVibrateThread) {
-    mVibrateThread->Shutdown();
-    mVibrateThread = nullptr;
-  }
-}
-
-VRSystemManagerOpenVR::VRSystemManagerOpenVR()
-  : mVRSystem(nullptr)
-  , mRuntimeCheckFailed(false)
-  , mIsWindowsMR(false)
-{
-}
-
-/*static*/ already_AddRefed<VRSystemManagerOpenVR>
-VRSystemManagerOpenVR::Create()
-{
-  MOZ_ASSERT(NS_IsMainThread());
-
-  if (!gfxPrefs::VREnabled() || !gfxPrefs::VROpenVREnabled()) {
-    return nullptr;
-  }
-
-  RefPtr<VRSystemManagerOpenVR> manager = new VRSystemManagerOpenVR();
-  return manager.forget();
-}
-
-void
-VRSystemManagerOpenVR::Destroy()
-{
-  Shutdown();
-}
-
-void
-VRSystemManagerOpenVR::Shutdown()
-{
-  if (mOpenVRHMD) {
-    mOpenVRHMD = nullptr;
-  }
-  RemoveControllers();
-  mVRSystem = nullptr;
-}
-
-void
-VRSystemManagerOpenVR::NotifyVSync()
-{
-  VRSystemManager::NotifyVSync();
-
-  // Avoid doing anything unless we have already
-  // successfully enumerated and loaded the OpenVR
-  // runtime.
-  if (mVRSystem == nullptr) {
-    return;
-  }
-
-  if (mOpenVRHMD) {
-    mOpenVRHMD->Refresh();
-    if (!mOpenVRHMD->GetIsHmdPresent()) {
-      // OpenVR runtime could be quit accidentally
-      // or a device could be disconnected.
-      // We free up resources and must re-initialize
-      // if a device is detected again later.
-      mOpenVRHMD = nullptr;
-      mVRSystem = nullptr;
-    }
-  }
-}
-
-void
-VRSystemManagerOpenVR::Enumerate()
-{
-  if (mOpenVRHMD) {
-    // Already enumerated, nothing more to do
-    return;
-  }
-  if (mRuntimeCheckFailed) {
-    // We have already checked for a runtime and
-    // know that its not installed.
-    return;
-  }
-  if (!::vr::VR_IsRuntimeInstalled()) {
-    // Runtime is not installed, remember so we don't
-    // continue to scan for the files
-    mRuntimeCheckFailed = true;
-    return;
-  }
-  if (!::vr::VR_IsHmdPresent()) {
-    // Avoid initializing if no headset is connected
-    return;
-  }
-
-  ::vr::HmdError err;
-
-  ::vr::VR_Init(&err, ::vr::EVRApplicationType::VRApplication_Scene);
-  if (err) {
-    return;
-  }
-
-  ::vr::IVRSystem *system = (::vr::IVRSystem *)::vr::VR_GetGenericInterface(::vr::IVRSystem_Version, &err);
-  if (err || !system) {
-    ::vr::VR_Shutdown();
-    return;
-  }
-  ::vr::IVRChaperone *chaperone = (::vr::IVRChaperone *)::vr::VR_GetGenericInterface(::vr::IVRChaperone_Version, &err);
-  if (err || !chaperone) {
-    ::vr::VR_Shutdown();
-    return;
-  }
-  ::vr::IVRCompositor *compositor = (::vr::IVRCompositor*)::vr::VR_GetGenericInterface(::vr::IVRCompositor_Version, &err);
-  if (err || !compositor) {
-    ::vr::VR_Shutdown();
-    return;
-  }
-
-  mVRSystem = system;
-  mOpenVRHMD = new VRDisplayOpenVR(system, chaperone, compositor);
-}
-
-bool
-VRSystemManagerOpenVR::ShouldInhibitEnumeration()
-{
-  if (VRSystemManager::ShouldInhibitEnumeration()) {
-    return true;
-  }
-  if (mOpenVRHMD) {
-    // When we find an a VR device, don't
-    // allow any further enumeration as it
-    // may get picked up redundantly by other
-    // API's.
-    return true;
-  }
-  return false;
-}
-
-void
-VRSystemManagerOpenVR::GetHMDs(nsTArray<RefPtr<VRDisplayHost>>& aHMDResult)
-{
-  if (mOpenVRHMD) {
-    aHMDResult.AppendElement(mOpenVRHMD);
-  }
-}
-
-bool
-VRSystemManagerOpenVR::GetIsPresenting()
-{
-  if (mOpenVRHMD) {
-    VRDisplayInfo displayInfo(mOpenVRHMD->GetDisplayInfo());
-    return displayInfo.GetPresentingGroups() != kVRGroupNone;
-  }
-
-  return false;
-}
-
-void
-VRSystemManagerOpenVR::HandleInput()
-{
-  // mVRSystem is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mVRSystem) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOpenVR> controller;
-  // Compare with Edge, we have a wrong implementation for the vertical axis value.
-  // In order to not affect the current VR content, we add a workaround for yAxis.
-  const float yAxisInvert = (mIsWindowsMR) ? -1.0f : 1.0f;
-  ::vr::VRControllerState_t state;
-  ::vr::TrackedDevicePose_t poses[::vr::k_unMaxTrackedDeviceCount];
-  mVRSystem->GetDeviceToAbsoluteTrackingPose(::vr::TrackingUniverseSeated, 0.0f,
-                                             poses, ::vr::k_unMaxTrackedDeviceCount);
-  // Process OpenVR controller state
-  for (uint32_t i = 0; i < mOpenVRController.Length(); ++i) {
-    uint32_t axisIdx = 0;
-    uint32_t buttonIdx = 0;
-    uint32_t triggerIdx = 0;
-    controller = mOpenVRController[i];
-    const uint32_t trackedIndex = controller->GetTrackedIndex();
-
-    MOZ_ASSERT(mVRSystem->GetTrackedDeviceClass(trackedIndex)
-               == ::vr::TrackedDeviceClass_Controller ||
-               mVRSystem->GetTrackedDeviceClass(trackedIndex)
-               == ::vr::TrackedDeviceClass_GenericTracker);
-
-    // Sometimes, OpenVR controllers are not located by HMD at the initial time.
-    // That makes us have to update the hand info at runtime although switching controllers
-    // to the other hand does not have new changes at the current OpenVR SDK. But, it makes sense
-    // to detect hand changing at runtime.
-    const ::vr::ETrackedControllerRole role = mVRSystem->
-                                                GetControllerRoleForTrackedDeviceIndex(
-                                                trackedIndex);
-    const dom::GamepadHand hand = GetGamepadHandFromControllerRole(role);
-    if (hand != controller->GetHand()) {
-      controller->SetHand(hand);
-      NewHandChangeEvent(i, hand);
-    }
-
-    if (mVRSystem->GetControllerState(trackedIndex, &state, sizeof(state))) {
-      for (uint32_t j = 0; j < ::vr::k_unControllerStateAxisCount; ++j) {
-        const uint32_t axisType = mVRSystem->GetInt32TrackedDeviceProperty(
-                                   trackedIndex,
-                                   static_cast<::vr::TrackedDeviceProperty>(
-                                   ::vr::Prop_Axis0Type_Int32 + j));
-        switch (axisType) {
-          case ::vr::EVRControllerAxisType::k_eControllerAxis_Joystick:
-          case ::vr::EVRControllerAxisType::k_eControllerAxis_TrackPad:
-            if (mIsWindowsMR) {
-              // Adjust the input mapping for Windows MR which has
-              // different order.
-              axisIdx = (axisIdx == 0) ? 2 : 0;
-              buttonIdx = (buttonIdx == 0) ? 4 : 0;
-            }
-
-            if (!HandleAxisMove(i, axisIdx, state.rAxis[j].x)) {
-              RemoveControllers();
-              return;
-            }
-            ++axisIdx;
-
-            if (!HandleAxisMove(i, axisIdx, state.rAxis[j].y * yAxisInvert)) {
-              RemoveControllers();
-              return;
-            }
-            ++axisIdx;
-
-            if (!HandleButtonPress(i, buttonIdx,
-                                   ::vr::ButtonMaskFromId(
-                                   static_cast<::vr::EVRButtonId>(::vr::k_EButton_Axis0 + j)),
-                                   state.ulButtonPressed, state.ulButtonTouched)) {
-              RemoveControllers();
-              return;
-            }
-            ++buttonIdx;
-
-            if (mIsWindowsMR) {
-              axisIdx = (axisIdx == 4) ? 2 : 4;
-              buttonIdx = (buttonIdx == 5) ? 1 : 2;
-            }
-            break;
-          case vr::EVRControllerAxisType::k_eControllerAxis_Trigger:
-            if (j <= 2) {
-              if (!HandleTriggerPress(i, buttonIdx, triggerIdx, state.rAxis[j].x)) {
-                RemoveControllers();
-                return;
-              }
-              ++buttonIdx;
-              ++triggerIdx;
-            } else {
-              // For SteamVR Knuckles.
-              if (!HandleTriggerPress(i, buttonIdx, triggerIdx, state.rAxis[j].x)) {
-                RemoveControllers();
-                return;
-              }
-              ++buttonIdx;
-              ++triggerIdx;
-              if (!HandleTriggerPress(i, buttonIdx, triggerIdx, state.rAxis[j].y)) {
-                RemoveControllers();
-                return;
-              }
-              ++buttonIdx;
-              ++triggerIdx;
-            }
-            break;
-        }
-      }
-      MOZ_ASSERT(axisIdx ==
-                 controller->GetControllerInfo().GetNumAxes());
-
-      const uint64_t supportedButtons = mVRSystem->GetUint64TrackedDeviceProperty(
-                                         trackedIndex, ::vr::Prop_SupportedButtons_Uint64);
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_A)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                               BTN_MASK_FROM_ID(k_EButton_A),
-                               state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_Grip)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                              BTN_MASK_FROM_ID(k_EButton_Grip),
-                              state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_ApplicationMenu)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                               BTN_MASK_FROM_ID(k_EButton_ApplicationMenu),
-                               state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (mIsWindowsMR) {
-        // button 4 in Windows MR has already been assigned
-        // to k_eControllerAxis_TrackPad.
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Left)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                               BTN_MASK_FROM_ID(k_EButton_DPad_Left),
-                               state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Up)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                          BTN_MASK_FROM_ID(k_EButton_DPad_Up),
-                          state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Right)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                               BTN_MASK_FROM_ID(k_EButton_DPad_Right),
-                               state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      if (supportedButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Down)) {
-        if (!HandleButtonPress(i, buttonIdx,
-                               BTN_MASK_FROM_ID(k_EButton_DPad_Down),
-                               state.ulButtonPressed, state.ulButtonTouched)) {
-          RemoveControllers();
-          return;
-        }
-        ++buttonIdx;
-      }
-      MOZ_ASSERT(buttonIdx ==
-                 controller->GetControllerInfo().GetNumButtons());
-      controller->SetButtonPressed(state.ulButtonPressed);
-      controller->SetButtonTouched(state.ulButtonTouched);
-
-      // Start to process pose
-      const ::vr::TrackedDevicePose_t& pose = poses[trackedIndex];
-      GamepadPoseState poseState;
-
-      if (pose.bDeviceIsConnected) {
-        poseState.flags |= (GamepadCapabilityFlags::Cap_Orientation |
-                            GamepadCapabilityFlags::Cap_Position);
-      }
-
-      if (pose.bPoseIsValid &&
-          pose.eTrackingResult == ::vr::TrackingResult_Running_OK) {
-        gfx::Matrix4x4 m;
-
-        // NOTE! mDeviceToAbsoluteTracking is a 3x4 matrix, not 4x4.  But
-        // because of its arrangement, we can copy the 12 elements in and
-        // then transpose them to the right place.  We do this so we can
-        // pull out a Quaternion.
-        memcpy(&m.components, &pose.mDeviceToAbsoluteTracking, sizeof(pose.mDeviceToAbsoluteTracking));
-        m.Transpose();
-
-        gfx::Quaternion rot;
-        rot.SetFromRotationMatrix(m);
-        rot.Invert();
-
-        poseState.orientation[0] = rot.x;
-        poseState.orientation[1] = rot.y;
-        poseState.orientation[2] = rot.z;
-        poseState.orientation[3] = rot.w;
-        poseState.angularVelocity[0] = pose.vAngularVelocity.v[0];
-        poseState.angularVelocity[1] = pose.vAngularVelocity.v[1];
-        poseState.angularVelocity[2] = pose.vAngularVelocity.v[2];
-        poseState.isOrientationValid = true;
-
-        poseState.position[0] = m._41;
-        poseState.position[1] = m._42;
-        poseState.position[2] = m._43;
-        poseState.linearVelocity[0] = pose.vVelocity.v[0];
-        poseState.linearVelocity[1] = pose.vVelocity.v[1];
-        poseState.linearVelocity[2] = pose.vVelocity.v[2];
-        poseState.isPositionValid = true;
-      }
-      HandlePoseTracking(i, poseState, controller);
-    }
-  }
-}
-
-bool
-VRSystemManagerOpenVR::HandleButtonPress(uint32_t aControllerIdx,
-                                         uint32_t aButton,
-                                         uint64_t aButtonMask,
-                                         uint64_t aButtonPressed,
-                                         uint64_t aButtonTouched)
-{
-  RefPtr<impl::VRControllerOpenVR> controller(mOpenVRController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  const uint64_t pressedDiff = (controller->GetButtonPressed() ^ aButtonPressed);
-  const uint64_t touchedDiff = (controller->GetButtonTouched() ^ aButtonTouched);
-
-  if (!pressedDiff && !touchedDiff) {
-    return true;
-  }
-
-  if (pressedDiff & aButtonMask ||
-      touchedDiff & aButtonMask) {
-    // diff & (aButtonPressed, aButtonTouched) would be true while a new button pressed or
-    // touched event, otherwise it is an old event and needs to notify
-    // the button has been released.
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("OpenVR handleButton(aButton = %d, length = %d, controller: %s.)",
-                              aButton,
-                              controller->GetControllerInfo().GetNumButtons(),
-                              controller->GetControllerInfo().GetControllerName());
-      return false;
-    }
-    NewButtonEvent(aControllerIdx, aButton, aButtonMask & aButtonPressed,
-                   aButtonMask & aButtonTouched,
-                   (aButtonMask & aButtonPressed) ? 1.0L : 0.0L);
-  }
-  return true;
-}
-
-bool
-VRSystemManagerOpenVR::HandleTriggerPress(uint32_t aControllerIdx,
-                                          uint32_t aButton,
-                                          uint32_t aTrigger,
-                                          float aValue)
-{
-  RefPtr<impl::VRControllerOpenVR> controller(mOpenVRController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-  const float oldValue = controller->GetTrigger(aTrigger);
-  // For OpenVR, the threshold value of ButtonPressed and ButtonTouched is 0.55.
-  // We prefer to let developers to set their own threshold for the adjustment.
-  // Therefore, we don't check ButtonPressed and ButtonTouched with ButtonMask here.
-  // we just check the button value is larger than the threshold value or not.
-  const float threshold = gfxPrefs::VRControllerTriggerThreshold();
-
-  // Avoid sending duplicated events in IPC channels.
-  if (oldValue != aValue) {
-    if (MOZ_UNLIKELY(aButton >= controller->GetControllerInfo().GetNumButtons())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("OpenVR handleTrigger(aButton = %d, length = %d, controller: %s.)",
-                              aButton,
-                              controller->GetControllerInfo().GetNumButtons(),
-                              controller->GetControllerInfo().GetControllerName());
-      return false;
-    }
-    NewButtonEvent(aControllerIdx, aButton, aValue > threshold,
-                   aValue > threshold, aValue);
-    controller->SetTrigger(aTrigger, aValue);
-  }
-  return true;
-}
-
-bool
-VRSystemManagerOpenVR::HandleAxisMove(uint32_t aControllerIdx, uint32_t aAxis,
-                                      float aValue)
-{
-  RefPtr<impl::VRControllerOpenVR> controller(mOpenVRController[aControllerIdx]);
-  MOZ_ASSERT(controller);
-
-  if (controller->GetAxisMove(aAxis) != aValue) {
-    if (MOZ_UNLIKELY(aAxis >= controller->GetControllerInfo().GetNumAxes())) {
-      // FIXME: Removing crash log for Bug 1488573 to investigate unmatched count.
-      MOZ_CRASH_UNSAFE_PRINTF("OpenVR handleAxis(aAxis = %d, length = %d, controller: %s.)",
-                              aAxis,
-                              controller->GetControllerInfo().GetNumAxes(),
-                              controller->GetControllerInfo().GetControllerName());
-      return false;
-    }
-    NewAxisMove(aControllerIdx, aAxis, aValue);
-    controller->SetAxisMove(aAxis, aValue);
-  }
-  return true;
-}
-
-void
-VRSystemManagerOpenVR::HandlePoseTracking(uint32_t aControllerIdx,
-                                          const GamepadPoseState& aPose,
-                                          VRControllerHost* aController)
-{
-  MOZ_ASSERT(aController);
-  if (aPose != aController->GetPose()) {
-    aController->SetPose(aPose);
-    NewPoseState(aControllerIdx, aPose);
-  }
-}
-
-dom::GamepadHand
-VRSystemManagerOpenVR::GetGamepadHandFromControllerRole(
-                                          ::vr::ETrackedControllerRole aRole)
-{
-  dom::GamepadHand hand;
-
-  switch(aRole) {
-    case ::vr::ETrackedControllerRole::TrackedControllerRole_Invalid:
-    case ::vr::ETrackedControllerRole::TrackedControllerRole_OptOut:
-      hand = dom::GamepadHand::_empty;
-      break;
-    case ::vr::ETrackedControllerRole::TrackedControllerRole_LeftHand:
-      hand = dom::GamepadHand::Left;
-      break;
-    case ::vr::ETrackedControllerRole::TrackedControllerRole_RightHand:
-      hand = dom::GamepadHand::Right;
-      break;
-    default:
-      hand = dom::GamepadHand::_empty;
-      MOZ_ASSERT(false);
-      break;
-  }
-
-  return hand;
-}
-
-void
-VRSystemManagerOpenVR::VibrateHaptic(uint32_t aControllerIdx,
-                                     uint32_t aHapticIndex,
-                                     double aIntensity,
-                                     double aDuration,
-                                     const VRManagerPromise& aPromise)
-{
-  // mVRSystem is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mVRSystem || (aControllerIdx >= mOpenVRController.Length())) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOpenVR> controller = mOpenVRController[aControllerIdx];
-  MOZ_ASSERT(controller);
-
-  controller->VibrateHaptic(mVRSystem, aHapticIndex, aIntensity, aDuration, aPromise);
-}
-
-void
-VRSystemManagerOpenVR::StopVibrateHaptic(uint32_t aControllerIdx)
-{
-  // mVRSystem is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mVRSystem || (aControllerIdx >= mOpenVRController.Length())) {
-    return;
-  }
-
-  RefPtr<impl::VRControllerOpenVR> controller = mOpenVRController[aControllerIdx];
-  MOZ_ASSERT(controller);
-
-  controller->StopVibrateHaptic();
-}
-
-void
-VRSystemManagerOpenVR::GetControllers(nsTArray<RefPtr<VRControllerHost>>& aControllerResult)
-{
-  aControllerResult.Clear();
-  for (uint32_t i = 0; i < mOpenVRController.Length(); ++i) {
-    aControllerResult.AppendElement(mOpenVRController[i]);
-  }
-}
-
-void
-VRSystemManagerOpenVR::ScanForControllers()
-{
-  // mVRSystem is available after VRDisplay is created
-  // at GetHMDs().
-  if (!mVRSystem) {
-    return;
-  }
-
-  ::vr::TrackedDeviceIndex_t trackedIndexArray[::vr::k_unMaxTrackedDeviceCount];
-  uint32_t newControllerCount = 0;
-  // Basically, we would have HMDs in the tracked devices,
-  // but we are just interested in the controllers.
-  for (::vr::TrackedDeviceIndex_t trackedDevice = ::vr::k_unTrackedDeviceIndex_Hmd + 1;
-       trackedDevice < ::vr::k_unMaxTrackedDeviceCount; ++trackedDevice) {
-
-    if (!mVRSystem->IsTrackedDeviceConnected(trackedDevice)) {
-      continue;
-    }
-
-    const ::vr::ETrackedDeviceClass deviceType = mVRSystem->
-                                                 GetTrackedDeviceClass(trackedDevice);
-    if (deviceType != ::vr::TrackedDeviceClass_Controller
-        && deviceType != ::vr::TrackedDeviceClass_GenericTracker) {
-      continue;
-    }
-
-    trackedIndexArray[newControllerCount] = trackedDevice;
-    ++newControllerCount;
-  }
-
-  if (newControllerCount != mControllerCount) {
-    RemoveControllers();
-
-    // Re-adding controllers to VRControllerManager.
-    for (::vr::TrackedDeviceIndex_t i = 0; i < newControllerCount; ++i) {
-      const ::vr::TrackedDeviceIndex_t trackedDevice = trackedIndexArray[i];
-      const ::vr::ETrackedDeviceClass deviceType = mVRSystem->
-                                                   GetTrackedDeviceClass(trackedDevice);
-      const ::vr::ETrackedControllerRole role = mVRSystem->
-                                                GetControllerRoleForTrackedDeviceIndex(
-                                                trackedDevice);
-      const GamepadHand hand = GetGamepadHandFromControllerRole(role);
-      uint32_t numButtons = 0;
-      uint32_t numTriggers = 0;
-      uint32_t numAxes = 0;
-
-      // Scan the axes that the controllers support
-      for (uint32_t j = 0; j < ::vr::k_unControllerStateAxisCount; ++j) {
-        const uint32_t supportAxis = mVRSystem->GetInt32TrackedDeviceProperty(trackedDevice,
-                                      static_cast<vr::TrackedDeviceProperty>(
-                                      ::vr::Prop_Axis0Type_Int32 + j));
-        switch (supportAxis) {
-          case ::vr::EVRControllerAxisType::k_eControllerAxis_Joystick:
-          case ::vr::EVRControllerAxisType::k_eControllerAxis_TrackPad:
-            numAxes += 2; // It has x and y axes.
-            ++numButtons;
-            break;
-          case ::vr::k_eControllerAxis_Trigger:
-            if (j <= 2) {
-              ++numButtons;
-              ++numTriggers;
-            } else {
-          #ifdef DEBUG
-              // SteamVR Knuckles is the only special case for using 2D axis values on triggers.
-              ::vr::ETrackedPropertyError err;
-              uint32_t requiredBufferLen;
-              char charBuf[128];
-              requiredBufferLen = mVRSystem->GetStringTrackedDeviceProperty(trackedDevice,
-                                  ::vr::Prop_RenderModelName_String, charBuf, 128, &err);
-              MOZ_ASSERT(requiredBufferLen && err == ::vr::TrackedProp_Success);
-              nsCString deviceId(charBuf);
-              MOZ_ASSERT(deviceId.Find("knuckles") != kNotFound);
-          #endif // #ifdef DEBUG
-              numButtons += 2;
-              numTriggers += 2;
-            }
-            break;
-        }
-      }
-
-      // Scan the buttons that the controllers support
-      const uint64_t supportButtons = mVRSystem->GetUint64TrackedDeviceProperty(
-                                       trackedDevice, ::vr::Prop_SupportedButtons_Uint64);
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_A)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_Grip)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_ApplicationMenu)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Left)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Up)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Right)) {
-        ++numButtons;
-      }
-      if (supportButtons &
-          BTN_MASK_FROM_ID(k_EButton_DPad_Down)) {
-        ++numButtons;
-      }
-
-      nsCString deviceId;
-      GetControllerDeviceId(deviceType, trackedDevice, deviceId);
-      RefPtr<VRControllerOpenVR> openVRController =
-        new VRControllerOpenVR(hand, mOpenVRHMD->GetDisplayInfo().GetDisplayID(),
-                               numButtons, numTriggers, numAxes, deviceId);
-      openVRController->SetTrackedIndex(trackedDevice);
-      mOpenVRController.AppendElement(openVRController);
-
-      // If the Windows MR controller doesn't has the amount
-      // of buttons or axes as our expectation, switching off
-      // the workaround for Windows MR.
-      if (mIsWindowsMR && (numAxes < 4 || numButtons < 5)) {
-        mIsWindowsMR = false;
-        NS_WARNING("OpenVR - Switching off Windows MR mode.");
-      }
-      // Not already present, add it.
-      AddGamepad(openVRController->GetControllerInfo());
-      ++mControllerCount;
-    }
-  }
-}
-
-void
-VRSystemManagerOpenVR::RemoveControllers()
-{
-  // The controller count is changed, removing the existing gamepads first.
-  for (uint32_t i = 0; i < mOpenVRController.Length(); ++i) {
-    mOpenVRController[i]->ShutdownVibrateHapticThread();
-    RemoveGamepad(i);
-  }
-  mOpenVRController.Clear();
-  mControllerCount = 0;
-}
-
-void
-VRSystemManagerOpenVR::GetControllerDeviceId(::vr::ETrackedDeviceClass aDeviceType,
-                                             ::vr::TrackedDeviceIndex_t aDeviceIndex, nsCString& aId)
-{
-  switch (aDeviceType) {
-    case ::vr::TrackedDeviceClass_Controller:
-    {
-      ::vr::ETrackedPropertyError err;
-      uint32_t requiredBufferLen;
-      bool isFound = false;
-      char charBuf[128];
-      requiredBufferLen = mVRSystem->GetStringTrackedDeviceProperty(aDeviceIndex,
-                          ::vr::Prop_RenderModelName_String, charBuf, 128, &err);
-      if (requiredBufferLen > 128) {
-        MOZ_CRASH("Larger than the buffer size.");
-      }
-      MOZ_ASSERT(requiredBufferLen && err == ::vr::TrackedProp_Success);
-      nsCString deviceId(charBuf);
-      if (deviceId.Find("knuckles") != kNotFound) {
-        aId.AssignLiteral("OpenVR Knuckles");
-        isFound = true;
-      }
-      requiredBufferLen = mVRSystem->GetStringTrackedDeviceProperty(aDeviceIndex,
-        ::vr::Prop_SerialNumber_String, charBuf, 128, &err);
-      if (requiredBufferLen > 128) {
-        MOZ_CRASH("Larger than the buffer size.");
-      }
-      MOZ_ASSERT(requiredBufferLen && err == ::vr::TrackedProp_Success);
-      deviceId.Assign(charBuf);
-      if (deviceId.Find("MRSOURCE") != kNotFound) {
-        aId.AssignLiteral("Spatial Controller (Spatial Interaction Source) ");
-        mIsWindowsMR = true;
-        isFound = true;
-      }
-      if (!isFound) {
-        aId.AssignLiteral("OpenVR Gamepad");
-      }
-      break;
-    }
-    case ::vr::TrackedDeviceClass_GenericTracker:
-    {
-      aId.AssignLiteral("OpenVR Tracker");
-      break;
-    }
-    default:
-      MOZ_ASSERT(false);
-      break;
-  }
-}
deleted file mode 100644
--- a/gfx/vr/gfxVROpenVR.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/* -*- 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_OPENVR_H
-#define GFX_VR_OPENVR_H
-
-#include "nsTArray.h"
-#include "nsIScreen.h"
-#include "nsCOMPtr.h"
-#include "mozilla/RefPtr.h"
-
-#include "mozilla/gfx/2D.h"
-#include "mozilla/EnumeratedArray.h"
-
-#include "openvr.h"
-#include "gfxVR.h"
-#include "VRDisplayLocal.h"
-
-#if defined(XP_MACOSX)
-class MacIOSurface;
-#endif
-namespace mozilla {
-namespace gfx {
-class VRThread;
-
-namespace impl {
-
-class VRDisplayOpenVR : public VRDisplayLocal
-{
-public:
-  void ZeroSensor() override;
-  bool GetIsHmdPresent();
-
-protected:
-  virtual VRHMDSensorState GetSensorState() override;
-  virtual void StartPresentation() override;
-  virtual void StopPresentation() override;
-#if defined(XP_WIN)
-  virtual bool SubmitFrame(ID3D11Texture2D* aSource,
-                           const IntSize& aSize,
-                           const gfx::Rect& aLeftEyeRect,
-                           const gfx::Rect& aRightEyeRect) override;
-#elif defined(XP_MACOSX)
-  virtual bool SubmitFrame(MacIOSurface* aMacIOSurface,
-                           const IntSize& aSize,
-                           const gfx::Rect& aLeftEyeRect,
-                           const gfx::Rect& aRightEyeRect) override;
-#endif
-
-public:
-  explicit VRDisplayOpenVR(::vr::IVRSystem *aVRSystem,
-                           ::vr::IVRChaperone *aVRChaperone,
-                           ::vr::IVRCompositor *aVRCompositor);
-  void Refresh();
-protected:
-  virtual ~VRDisplayOpenVR();
-  void Destroy();
-
-  // not owned by us; global from OpenVR
-  ::vr::IVRSystem *mVRSystem;
-  ::vr::IVRChaperone *mVRChaperone;
-  ::vr::IVRCompositor *mVRCompositor;
-
-  VRTelemetry mTelemetry;
-  bool mIsPresenting;
-  bool mIsHmdPresent;
-
-  void UpdateStageParameters();
-  void UpdateEyeParameters(gfx::Matrix4x4* aHeadToEyeTransforms = nullptr);
-  bool SubmitFrameOpenVRHandle(void* aTextureHandle,
-                               ::vr::ETextureType aTextureType,
-                               const IntSize& aSize,
-                               const gfx::Rect& aLeftEyeRect,
-                               const gfx::Rect& aRightEyeRect);
-};
-
-class VRControllerOpenVR : public VRControllerHost
-{
-public:
-  explicit VRControllerOpenVR(dom::GamepadHand aHand, uint32_t aDisplayID, uint32_t aNumButtons,
-                              uint32_t aNumTriggers, uint32_t aNumAxes,
-                              const nsCString& aId);
-  void SetTrackedIndex(uint32_t aTrackedIndex);
-  uint32_t GetTrackedIndex();
-  float GetAxisMove(uint32_t aAxis);
-  void SetAxisMove(uint32_t aAxis, float aValue);
-  void SetTrigger(uint32_t aButton, float aValue);
-  float GetTrigger(uint32_t aButton);
-  void SetHand(dom::GamepadHand aHand);
-  void VibrateHaptic(::vr::IVRSystem* aVRSystem,
-                     uint32_t aHapticIndex,
-                     double aIntensity,
-                     double aDuration,
-                     const VRManagerPromise& aPromise);
-  void StopVibrateHaptic();
-  void ShutdownVibrateHapticThread();
-
-protected:
-  virtual ~VRControllerOpenVR();
-
-private:
-  void UpdateVibrateHaptic(::vr::IVRSystem* aVRSystem,
-                           uint32_t aHapticIndex,
-                           double aIntensity,
-                           double aDuration,
-                           uint64_t aVibrateIndex,
-                           const VRManagerPromise& aPromise);
-  void VibrateHapticComplete(const VRManagerPromise& aPromise);
-
-  // The index of tracked devices from ::vr::IVRSystem.
-  uint32_t mTrackedIndex;
-  RefPtr<VRThread> mVibrateThread;
-  Atomic<bool> mIsVibrateStopped;
-};
-
-} // namespace impl
-
-class VRSystemManagerOpenVR : public VRSystemManager
-{
-public:
-  static already_AddRefed<VRSystemManagerOpenVR> Create();
-
-  virtual void Destroy() override;
-  virtual void Shutdown() override;
-  virtual void NotifyVSync() override;
-  virtual void Enumerate() override;
-  virtual bool ShouldInhibitEnumeration() 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,
-                             const VRManagerPromise& aPromise) override;
-  virtual void StopVibrateHaptic(uint32_t aControllerIdx) override;
-
-protected:
-  VRSystemManagerOpenVR();
-
-private:
-  bool HandleButtonPress(uint32_t aControllerIdx,
-                         uint32_t aButton,
-                         uint64_t aButtonMask,
-                         uint64_t aButtonPressed,
-                         uint64_t aButtonTouched);
-  bool HandleTriggerPress(uint32_t aControllerIdx,
-                          uint32_t aButton,
-                          uint32_t aTrigger,
-                          float aValue);
-  bool HandleAxisMove(uint32_t aControllerIdx, uint32_t aAxis,
-                      float aValue);
-  void HandlePoseTracking(uint32_t aControllerIdx,
-                          const dom::GamepadPoseState& aPose,
-                          VRControllerHost* aController);
-  dom::GamepadHand GetGamepadHandFromControllerRole(
-                          ::vr::ETrackedControllerRole aRole);
-  void GetControllerDeviceId(::vr::ETrackedDeviceClass aDeviceType,
-                             ::vr::TrackedDeviceIndex_t aDeviceIndex,
-                             nsCString& aId);
-
-  // there can only be one
-  RefPtr<impl::VRDisplayOpenVR> mOpenVRHMD;
-  nsTArray<RefPtr<impl::VRControllerOpenVR>> mOpenVRController;
-  ::vr::IVRSystem *mVRSystem;
-  bool mRuntimeCheckFailed;
-  bool mIsWindowsMR;
-};
-
-} // namespace gfx
-} // namespace mozilla
-
-
-#endif /* GFX_VR_OPENVR_H */
--- a/gfx/vr/moz.build
+++ b/gfx/vr/moz.build
@@ -56,63 +56,33 @@ UNIFIED_SOURCES += [
 # often conflict with our own types.
 SOURCES += [
     'gfxVRExternal.cpp',
     'gfxVRPuppet.cpp',
     'VRDisplayHost.cpp',
     'VRDisplayLocal.cpp',
 ]
 
-# Build OpenVR on Windows, Linux, and macOS desktop targets
-if CONFIG['OS_TARGET'] in ('WINNT', 'Linux', 'Darwin'):
-    DIRS += [
-        'openvr',
-    ]
-    SOURCES += [
-        'gfxVROpenVR.cpp',
-    ]
-
-if CONFIG['OS_TARGET'] == 'WINNT':
-    SOURCES += [
-        'gfxVROculus.cpp',
-    ]
-
 if CONFIG['OS_TARGET'] == 'Android':
     LOCAL_INCLUDES += ['/widget/android']
 else:
     DIRS += [
         'service',
     ]
 
 IPDL_SOURCES = [
     'ipc/PVR.ipdl',
     'ipc/PVRGPU.ipdl',
     'ipc/PVRLayer.ipdl',
     'ipc/PVRManager.ipdl',
 ]
 
-# For building with the real SDK instead of our local hack
-#SOURCES += [
-#    'OVR_CAPI_Util.cpp',
-#    'OVR_CAPIShim.c',
-#    'OVR_StereoProjection.cpp',
-#]
-#
-#CXXFLAGS += ["-Ic:/proj/ovr/OculusSDK-0.6.0-beta/LibOVR/Include"]
-#CFLAGS += ["-Ic:/proj/ovr/OculusSDK-0.6.0-beta/LibOVR/Include"]
-
 CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
 CXXFLAGS += CONFIG['TK_CFLAGS']
 CFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
 CFLAGS += CONFIG['TK_CFLAGS']
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
 FINAL_LIBRARY = 'xul'
 
-# This is intended as a temporary hack to enable VS2015 builds.
-if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
-    # ovr_capi_dynamic.h '<unnamed-tag>': Alignment specifier is less than
-    # actual alignment (8), and will be ignored
-    CXXFLAGS += ['-wd4359']
-
 if CONFIG['CC_TYPE'] == 'clang-cl':
     AllowCompilerWarnings()  # workaround for bug 1090497
--- a/gfx/vr/service/OculusSession.h
+++ b/gfx/vr/service/OculusSession.h
@@ -7,17 +7,17 @@
 #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 "../ovr_capi_dynamic.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;
--- a/gfx/vr/service/moz.build
+++ b/gfx/vr/service/moz.build
@@ -16,16 +16,19 @@ if CONFIG['OS_TARGET'] != 'Android':
         'OSVRSession.cpp',
         'VRService.cpp',
         'VRSession.cpp',
     ]
     include('/ipc/chromium/chromium-config.mozbuild')
 
 # Build OpenVR on Windows, Linux, and macOS desktop targets
 if CONFIG['OS_TARGET'] in ('WINNT', 'Linux', 'Darwin'):
+    DIRS += [
+        'openvr',
+    ]
     LOCAL_INCLUDES += [
         '/dom/base',
         '/gfx/layers/d3d11'
     ]
 
     # OpenVRSession includes MacIOSurface.h which includes Mac headers
     # which define Size and Points types in the root namespace that
     # often conflict with our own types.
rename from gfx/vr/ovr_capi_dynamic.h
rename to gfx/vr/service/oculus/ovr_capi_dynamic.h
rename from gfx/vr/openvr/LICENSE
rename to gfx/vr/service/openvr/LICENSE
rename from gfx/vr/openvr/README.md
rename to gfx/vr/service/openvr/README.md
rename from gfx/vr/openvr/README.mozilla
rename to gfx/vr/service/openvr/README.mozilla
--- a/gfx/vr/openvr/README.mozilla
+++ b/gfx/vr/service/openvr/README.mozilla
@@ -21,25 +21,26 @@ We only use some files from the SDK:
   files to configure the library.
 
 - The "src/jsoncpp.cpp" file and the "src/json" directory can be skipped. OpenVR
   uses the jsoncpp library, which we have already imported elsewhere.
 
 
 Steps to update the library:
 
-- Copy "README.md" from the root of the openvr repo to the "gfx/vr/openvr" directory.
+- Copy "README.md" from the root of the openvr repo to the "gfx/vr/service/openvr"
+  directory.
 
-- Copy "headers/openvr.h" to "gfx/vr/openvr/headers" directory. The other files
+- Copy "headers/openvr.h" to "gfx/vr/service/openvr/headers" directory. The other files
   in this directory can be ignored.
 
 - The rest of the files in the "src" directory and the "src/vrcommon" are copied
-  to the "gfx/vr/openvr/src" directory.
+  to the "gfx/vr/service/openvr/src" directory.
 
-- Update "gfx/vr/openvr/moz.build" when files are added or removed.
+- Update "gfx/vr/service/openvr/moz.build" when files are added or removed.
 
 - Update the "strtools_public.h" and "strtools_public.cpp" files, commenting out
   the "Uint64ToString", "wcsncpy_s", and "strncpy_s" functions.
   The "Uint64ToString" function name conflicts with another used in Gecko and
   the "errno_t" return type returned by the other functions is not defined in
   Mozilla's macOS continuous integration build environments.  Fortunately, the
   OpenVR SDK does not use these functions.
 
rename from gfx/vr/openvr/headers/openvr.h
rename to gfx/vr/service/openvr/headers/openvr.h
rename from gfx/vr/openvr/moz.build
rename to gfx/vr/service/openvr/moz.build
rename from gfx/vr/openvr/src/README
rename to gfx/vr/service/openvr/src/README
rename from gfx/vr/openvr/src/dirtools_public.cpp
rename to gfx/vr/service/openvr/src/dirtools_public.cpp
rename from gfx/vr/openvr/src/dirtools_public.h
rename to gfx/vr/service/openvr/src/dirtools_public.h
rename from gfx/vr/openvr/src/envvartools_public.cpp
rename to gfx/vr/service/openvr/src/envvartools_public.cpp
rename from gfx/vr/openvr/src/envvartools_public.h
rename to gfx/vr/service/openvr/src/envvartools_public.h
rename from gfx/vr/openvr/src/hmderrors_public.cpp
rename to gfx/vr/service/openvr/src/hmderrors_public.cpp
rename from gfx/vr/openvr/src/hmderrors_public.h
rename to gfx/vr/service/openvr/src/hmderrors_public.h
rename from gfx/vr/openvr/src/ivrclientcore.h
rename to gfx/vr/service/openvr/src/ivrclientcore.h
rename from gfx/vr/openvr/src/openvr_api_public.cpp
rename to gfx/vr/service/openvr/src/openvr_api_public.cpp
rename from gfx/vr/openvr/src/pathtools_public.cpp
rename to gfx/vr/service/openvr/src/pathtools_public.cpp
rename from gfx/vr/openvr/src/pathtools_public.h
rename to gfx/vr/service/openvr/src/pathtools_public.h
rename from gfx/vr/openvr/src/sharedlibtools_public.cpp
rename to gfx/vr/service/openvr/src/sharedlibtools_public.cpp
rename from gfx/vr/openvr/src/sharedlibtools_public.h
rename to gfx/vr/service/openvr/src/sharedlibtools_public.h
rename from gfx/vr/openvr/src/strtools_public.cpp
rename to gfx/vr/service/openvr/src/strtools_public.cpp
rename from gfx/vr/openvr/src/strtools_public.h
rename to gfx/vr/service/openvr/src/strtools_public.h
rename from gfx/vr/openvr/src/vrpathregistry_public.cpp
rename to gfx/vr/service/openvr/src/vrpathregistry_public.cpp
rename from gfx/vr/openvr/src/vrpathregistry_public.h
rename to gfx/vr/service/openvr/src/vrpathregistry_public.h
--- a/toolkit/content/license.html
+++ b/toolkit/content/license.html
@@ -4978,17 +4978,17 @@ PERFORMANCE OF THIS SOFTWARE.
 
 #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX)
 
     <hr>
 
     <h1><a id="openvr"></a>OpenVR License</h1>
 
     <p>This license applies to certain files in the directory
-    <code>gfx/vr/openvr</code>.</p>
+    <code>gfx/vr/service/openvr</code>.</p>
 <pre>
 Copyright (c) 2015, Valve Corporation
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
 are permitted provided that the following conditions are met:
 
 1. Redistributions of source code must retain the above copyright notice, this
--- a/tools/rewriting/ThirdPartyPaths.txt
+++ b/tools/rewriting/ThirdPartyPaths.txt
@@ -15,17 +15,17 @@ extensions/spellcheck/hunspell/src/
 gfx/angle/
 gfx/cairo/
 gfx/graphite2/
 gfx/harfbuzz/
 gfx/ots/
 gfx/qcms/
 gfx/sfntly/
 gfx/skia/
-gfx/vr/openvr/
+gfx/vr/service/openvr/
 gfx/webrender/
 gfx/webrender_api/
 gfx/wrench/
 gfx/ycbcr/
 intl/hyphenation/hyphen/
 intl/icu/
 ipc/chromium/
 js/src/ctypes/libffi/