Bug 1373279 - Avoid checking for OpenVR runtime until hitting WebVR content draft
authorKearwood "Kip" Gilbert <kgilbert@mozilla.com>
Thu, 03 May 2018 16:27:46 -0700
changeset 793430 31feca3b4b02497f4aacff4b41921dc3398b5732
parent 793238 76aad17f5b50a1b969eec8cbb5aa9875555640bc
push id109376
push userkgilbert@mozilla.com
push dateThu, 10 May 2018 00:13:21 +0000
bugs1373279
milestone62.0a1
Bug 1373279 - Avoid checking for OpenVR runtime until hitting WebVR content MozReview-Commit-ID: 9nUZ44uZEjE
gfx/vr/gfxVROpenVR.cpp
gfx/vr/gfxVROpenVR.h
--- a/gfx/vr/gfxVROpenVR.cpp
+++ b/gfx/vr/gfxVROpenVR.cpp
@@ -589,33 +589,30 @@ VRControllerOpenVR::ShutdownVibrateHapti
   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;
   }
 
-  if (!::vr::VR_IsRuntimeInstalled()) {
-    return nullptr;
-  }
-
   RefPtr<VRSystemManagerOpenVR> manager = new VRSystemManagerOpenVR();
   return manager.forget();
 }
 
 void
 VRSystemManagerOpenVR::Destroy()
 {
   Shutdown();
@@ -654,43 +651,61 @@ VRSystemManagerOpenVR::NotifyVSync()
       mVRSystem = nullptr;
     }
   }
 }
 
 void
 VRSystemManagerOpenVR::Enumerate()
 {
-  if (mOpenVRHMD == nullptr && ::vr::VR_IsHmdPresent()) {
-    ::vr::HmdError err;
+  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::VR_Init(&err, ::vr::EVRApplicationType::VRApplication_Scene);
-    if (err) {
-      return;
-    }
+  ::vr::HmdError err;
 
-    ::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;
-    }
+  ::vr::VR_Init(&err, ::vr::EVRApplicationType::VRApplication_Scene);
+  if (err) {
+    return;
+  }
 
-    mVRSystem = system;
-    mOpenVRHMD = new VRDisplayOpenVR(system, chaperone, compositor);
+  ::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;
   }
--- a/gfx/vr/gfxVROpenVR.h
+++ b/gfx/vr/gfxVROpenVR.h
@@ -165,16 +165,17 @@ private:
   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 */