Bug 1373279 - Avoid checking for OpenVR runtime until hitting WebVR content
MozReview-Commit-ID: 9nUZ44uZEjE
--- 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 */