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 491235 99bb541e5ce1e45f80f914b99077752bd99d77b5
parent 491234 226a941a7069093cd5770168ee123fa5630c41c1
child 491236 7e0e03b9169e2c5046e8bd8b947edccf04fbdc1b
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
reviewersdaoshengmu
bugs1501455
milestone65.0a1
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/