From 776893a5ab88cb77e14904073a5bfe7121bab0aa Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 11:22:56 -0700 Subject: [PATCH 1/6] Improve logging for oculus errors --- .../oculus/src/OculusBaseDisplayPlugin.cpp | 2 +- plugins/oculus/src/OculusDisplayPlugin.cpp | 2 +- plugins/oculus/src/OculusHelpers.cpp | 26 ++++++++++++++++--- plugins/oculus/src/OculusHelpers.h | 2 ++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 29fc014a64..1ed5c9f22a 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -65,7 +65,7 @@ void OculusBaseDisplayPlugin::internalActivate() { if (!OVR_SUCCESS(ovr_ConfigureTracking(_session, ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrTrackingCap_MagYawCorrection, 0))) { - qWarning() << "Could not attach to sensor device"; + logWarning("Failed to attach to sensor device"); } // Parent class relies on our _session intialization, so it must come after that. diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 71a858e1e8..8c3a676c61 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -67,7 +67,7 @@ void OculusDisplayPlugin::hmdPresent() { ovrLayerHeader* layers = &_sceneLayer.Header; ovrResult result = ovr_SubmitFrame(_session, _currentRenderFrameIndex, &_viewScaleDesc, &layers, 1); if (!OVR_SUCCESS(result)) { - qDebug() << result; + logWarning("Failed to present"); } } _sceneFbo->Increment(); diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index db65c72aac..170be05952 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -10,16 +10,34 @@ #include #include + using Mutex = std::mutex; using Lock = std::unique_lock; - Q_DECLARE_LOGGING_CATEGORY(oculus) Q_LOGGING_CATEGORY(oculus, "hifi.plugins.oculus") static std::atomic refCount { 0 }; static ovrSession session { nullptr }; +inline ovrErrorInfo getError() { + ovrErrorInfo error; + ovr_GetLastErrorInfo(&error); + return error; +} + +void logWarning(const char* what) { + qWarning(oculus) << what << ":" << getError().ErrorString; +} + +void logFatal(const char* what) { + std::string error("[oculus] "); + error += what; + error += ": "; + error += getError().ErrorString; + qFatal(error.c_str()); +} + bool oculusAvailable() { ovrDetectResult detect = ovr_Detect(0); return (detect.IsOculusServiceRunning && detect.IsOculusHMDConnected); @@ -37,14 +55,14 @@ ovrSession acquireOculusSession() { init.ConnectionTimeoutMS = 0; init.LogCallback = nullptr; if (!OVR_SUCCESS(ovr_Initialize(nullptr))) { - qCWarning(oculus) << "Failed to initialize Oculus SDK"; + logWarning("Failed to initialize Oculus SDK"); return session; } Q_ASSERT(0 == refCount); ovrGraphicsLuid luid; if (!OVR_SUCCESS(ovr_Create(&session, &luid))) { - qCWarning(oculus) << "Failed to acquire Oculus session"; + logWarning("Failed to acquire Oculus session"); return session; } } @@ -105,7 +123,7 @@ void SwapFramebufferWrapper::initColor() { destroyColor(); if (!OVR_SUCCESS(ovr_CreateSwapTextureSetGL(_session, GL_SRGB8_ALPHA8, size.x, size.y, &color))) { - qFatal("Unable to create swap textures"); + logFatal("Failed to create swap textures"); } for (int i = 0; i < color->TextureCount; ++i) { diff --git a/plugins/oculus/src/OculusHelpers.h b/plugins/oculus/src/OculusHelpers.h index cd527b184b..e10e058ad2 100644 --- a/plugins/oculus/src/OculusHelpers.h +++ b/plugins/oculus/src/OculusHelpers.h @@ -14,6 +14,8 @@ #include +void logWarning(const char* what); +void logFatal(const char* what); bool oculusAvailable(); ovrSession acquireOculusSession(); void releaseOculusSession(); From 931cad34d166f5ebc33b04d262e7678f45971b84 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 12:05:58 -0700 Subject: [PATCH 2/6] Check plugin activation success --- .../Basic2DWindowOpenGLDisplayPlugin.cpp | 6 +++--- .../display-plugins/Basic2DWindowOpenGLDisplayPlugin.h | 2 +- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 9 ++++++--- .../src/display-plugins/OpenGLDisplayPlugin.h | 5 +++-- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 5 +++-- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 +- .../src/display-plugins/stereo/StereoDisplayPlugin.cpp | 5 +++-- .../src/display-plugins/stereo/StereoDisplayPlugin.h | 2 +- libraries/plugins/src/plugins/DisplayPlugin.cpp | 4 ++-- libraries/plugins/src/plugins/DisplayPlugin.h | 2 +- libraries/plugins/src/plugins/Plugin.h | 4 +++- plugins/hifiNeuron/src/NeuronPlugin.cpp | 8 ++++++-- plugins/hifiNeuron/src/NeuronPlugin.h | 2 +- plugins/hifiSdl2/src/SDL2Manager.cpp | 8 ++++++-- plugins/hifiSdl2/src/SDL2Manager.h | 4 +--- plugins/hifiSixense/src/SixenseManager.cpp | 5 ++++- plugins/hifiSixense/src/SixenseManager.h | 2 +- plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 7 +++++-- plugins/oculus/src/OculusBaseDisplayPlugin.h | 2 +- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 10 ++++++++-- plugins/openvr/src/OpenVrDisplayPlugin.h | 2 +- plugins/openvr/src/ViveControllerManager.cpp | 5 ++++- plugins/openvr/src/ViveControllerManager.h | 4 +--- 23 files changed, 66 insertions(+), 39 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 63cb1b80a4..3e3efec4a2 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -19,9 +19,7 @@ const QString Basic2DWindowOpenGLDisplayPlugin::NAME("Desktop"); static const QString FULLSCREEN = "Fullscreen"; -void Basic2DWindowOpenGLDisplayPlugin::internalActivate() { - Parent::internalActivate(); - +bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { _framerateActions.clear(); _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), FULLSCREEN, [this](bool clicked) { @@ -33,6 +31,8 @@ void Basic2DWindowOpenGLDisplayPlugin::internalActivate() { }, true, false); updateFramerate(); + + return Parent::internalActivate(); } void Basic2DWindowOpenGLDisplayPlugin::submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) { diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 90b32a1924..40c6eb4381 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -22,7 +22,7 @@ public: virtual float getTargetFrameRate() override { return _framerateTarget ? (float) _framerateTarget : TARGET_FRAMERATE_Basic2DWindowOpenGL; } - virtual void internalActivate() override; + virtual bool internalActivate() override; virtual void submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) override; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index d842dc553b..8049e2d5a5 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -219,7 +219,7 @@ void OpenGLDisplayPlugin::cleanupForSceneTexture(const gpu::TexturePointer& scen } -void OpenGLDisplayPlugin::activate() { +bool OpenGLDisplayPlugin::activate() { if (!_cursorsData.size()) { auto& cursorManager = Cursor::Manager::instance(); for (const auto iconId : cursorManager.registeredIcons()) { @@ -238,7 +238,9 @@ void OpenGLDisplayPlugin::activate() { // Child classes may override this in order to do things like initialize // libraries, etc - internalActivate(); + if (!internalActivate()) { + return false; + } #if THREADED_PRESENT @@ -263,7 +265,8 @@ void OpenGLDisplayPlugin::activate() { customizeContext(); _container->makeRenderingContextCurrent(); #endif - DisplayPlugin::activate(); + + return DisplayPlugin::activate(); } void OpenGLDisplayPlugin::deactivate() { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 7295b07ad3..b9628deb6c 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -32,7 +32,7 @@ public: // These must be final to ensure proper ordering of operations // between the main thread and the presentation thread - void activate() override final; + bool activate() override final; void deactivate() override final; bool eventFilter(QObject* receiver, QEvent* event) override; @@ -77,7 +77,8 @@ protected: virtual void customizeContext(); virtual void uncustomizeContext(); - virtual void internalActivate() {} + // Returns true on successful activation + virtual bool internalActivate() { return true; } virtual void internalDeactivate() {} virtual void cleanupForSceneTexture(const gpu::TexturePointer& sceneTexture); // Plugin specific functionality to send the composed scene to the output window or device diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index b022b10887..5be3f0d96a 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -32,7 +32,7 @@ glm::uvec2 HmdDisplayPlugin::getRecommendedUiSize() const { return CompositorHelper::VIRTUAL_SCREEN_SIZE; } -void HmdDisplayPlugin::internalActivate() { +bool HmdDisplayPlugin::internalActivate() { _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW); _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), MONO_PREVIEW, @@ -41,7 +41,8 @@ void HmdDisplayPlugin::internalActivate() { _container->setBoolSetting("monoPreview", _monoPreview); }, true, _monoPreview); _container->removeMenu(FRAMERATE); - Parent::internalActivate(); + + return Parent::internalActivate(); } void HmdDisplayPlugin::customizeContext() { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index fede16c3a5..080a44bc66 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -33,7 +33,7 @@ protected: virtual bool isHmdMounted() const = 0; virtual void postPreview() {}; - void internalActivate() override; + bool internalActivate() override; void compositeOverlay() override; void compositePointer() override; void internalPresent() override; diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp index ae9f18e20d..66a4ba4835 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp @@ -58,7 +58,7 @@ glm::mat4 StereoDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4& basePr static const QString FRAMERATE = DisplayPlugin::MENU_PATH() + ">Framerate"; std::vector _screenActions; -void StereoDisplayPlugin::internalActivate() { +bool StereoDisplayPlugin::internalActivate() { auto screens = qApp->screens(); _screenActions.resize(screens.size()); for (int i = 0; i < screens.size(); ++i) { @@ -77,7 +77,8 @@ void StereoDisplayPlugin::internalActivate() { _screen = qApp->primaryScreen(); _container->setFullscreen(_screen); - Parent::internalActivate(); + + return Parent::internalActivate(); } void StereoDisplayPlugin::updateScreen() { diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h index 6563c2ae89..3b481dce97 100644 --- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h @@ -29,7 +29,7 @@ public: // virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override; protected: - virtual void internalActivate() override; + virtual bool internalActivate() override; virtual void internalDeactivate() override; void updateScreen(); diff --git a/libraries/plugins/src/plugins/DisplayPlugin.cpp b/libraries/plugins/src/plugins/DisplayPlugin.cpp index 3860639614..c7fa5f5671 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.cpp +++ b/libraries/plugins/src/plugins/DisplayPlugin.cpp @@ -4,11 +4,11 @@ #include "PluginContainer.h" -void DisplayPlugin::activate() { - Parent::activate(); +bool DisplayPlugin::activate() { if (isHmd() && (getHmdScreen() >= 0)) { _container->showDisplayPluginsTools(); } + return Parent::activate(); } void DisplayPlugin::deactivate() { diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index e5ac78036e..f4f28176c7 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -59,7 +59,7 @@ class DisplayPlugin : public Plugin { Q_OBJECT using Parent = Plugin; public: - void activate() override; + bool activate() override; void deactivate() override; virtual bool isHmd() const { return false; } virtual int getHmdScreen() const { return -1; } diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index ee10ce331c..fb5bf0ba55 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -38,8 +38,10 @@ public: virtual void deinit(); /// Called when a plugin is being activated for use. May be called multiple times. - virtual void activate() { + /// Returns true if plugin was successfully activated. + virtual bool activate() { _active = true; + return _active; } /// Called when a plugin is no longer being used. May be called multiple times. diff --git a/plugins/hifiNeuron/src/NeuronPlugin.cpp b/plugins/hifiNeuron/src/NeuronPlugin.cpp index e2143dbdcf..f2b8c04827 100644 --- a/plugins/hifiNeuron/src/NeuronPlugin.cpp +++ b/plugins/hifiNeuron/src/NeuronPlugin.cpp @@ -451,10 +451,10 @@ bool NeuronPlugin::isSupported() const { #endif } -void NeuronPlugin::activate() { -#ifdef HAVE_NEURON +bool NeuronPlugin::activate() { InputPlugin::activate(); +#ifdef HAVE_NEURON // register with userInputMapper auto userInputMapper = DependencyManager::get(); userInputMapper->registerDevice(_inputDevice); @@ -473,11 +473,15 @@ void NeuronPlugin::activate() { if (!_socketRef) { // error qCCritical(inputplugins) << "NeuronPlugin: error connecting to " << _serverAddress.c_str() << ":" << _serverPort << ", error = " << BRGetLastErrorMessage(); + return false; } else { qCDebug(inputplugins) << "NeuronPlugin: success connecting to " << _serverAddress.c_str() << ":" << _serverPort; BRRegisterAutoSyncParmeter(_socketRef, Cmd_CombinationMode); + return true; } +#else + return false; #endif } diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h index afe8530b07..99859dcacb 100644 --- a/plugins/hifiNeuron/src/NeuronPlugin.h +++ b/plugins/hifiNeuron/src/NeuronPlugin.h @@ -31,7 +31,7 @@ public: virtual const QString& getName() const override { return NAME; } const QString& getID() const override { return NEURON_ID_STRING; } - virtual void activate() override; + virtual bool activate() override; virtual void deactivate() override; virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp index 58da2c5df0..7091b20d21 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.cpp +++ b/plugins/hifiSdl2/src/SDL2Manager.cpp @@ -99,15 +99,19 @@ void SDL2Manager::deinit() { #endif } -void SDL2Manager::activate() { +bool SDL2Manager::activate() { + InputPlugin::activate(); + #ifdef HAVE_SDL2 auto userInputMapper = DependencyManager::get(); for (auto joystick : _openJoysticks) { userInputMapper->registerDevice(joystick); emit joystickAdded(joystick.get()); } + return true; +#else + return false; #endif - InputPlugin::activate(); } void SDL2Manager::deactivate() { diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index a88e41128d..5e3e16d090 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -34,9 +34,7 @@ public: virtual void init() override; virtual void deinit() override; - /// Called when a plugin is being activated for use. May be called multiple times. - virtual void activate() override; - /// Called when a plugin is no longer being used. May be called multiple times. + virtual bool activate() override; virtual void deactivate() override; virtual void pluginFocusOutEvent() override; diff --git a/plugins/hifiSixense/src/SixenseManager.cpp b/plugins/hifiSixense/src/SixenseManager.cpp index 9fdce3add4..eb55d84664 100644 --- a/plugins/hifiSixense/src/SixenseManager.cpp +++ b/plugins/hifiSixense/src/SixenseManager.cpp @@ -79,7 +79,7 @@ bool SixenseManager::isSupported() const { #endif } -void SixenseManager::activate() { +bool SixenseManager::activate() { InputPlugin::activate(); #ifdef HAVE_SIXENSE @@ -101,6 +101,9 @@ void SixenseManager::activate() { loadSettings(); _sixenseLoaded = (sixenseInit() == SIXENSE_SUCCESS); + return _sixenseLoaded; +#else + return false; #endif } diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h index 5106c87836..a46614b17a 100644 --- a/plugins/hifiSixense/src/SixenseManager.h +++ b/plugins/hifiSixense/src/SixenseManager.h @@ -32,7 +32,7 @@ public: virtual const QString& getName() const override { return NAME; } virtual const QString& getID() const override { return HYDRA_ID_STRING; } - virtual void activate() override; + virtual bool activate() override; virtual void deactivate() override; virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 1ed5c9f22a..e23d8cade6 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -34,8 +34,11 @@ void OculusBaseDisplayPlugin::customizeContext() { Parent::customizeContext(); } -void OculusBaseDisplayPlugin::internalActivate() { +bool OculusBaseDisplayPlugin::internalActivate() { _session = acquireOculusSession(); + if (!_session) { + return false; + } _hmdDesc = ovr_GetHmdDesc(_session); @@ -81,7 +84,7 @@ void OculusBaseDisplayPlugin::internalActivate() { // This must come after the initialization, so that the values calculated // above are available during the customizeContext call (when not running // in threaded present mode) - Parent::internalActivate(); + return Parent::internalActivate(); } void OculusBaseDisplayPlugin::internalDeactivate() { diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index 5455b61a60..d21b0561bc 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -24,7 +24,7 @@ public: protected: void customizeContext() override; - void internalActivate() override; + bool internalActivate() override; void internalDeactivate() override; protected: diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 0e7541066e..c4d8b252f0 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -41,14 +41,18 @@ bool OpenVrDisplayPlugin::isSupported() const { return !isOculusPresent() && vr::VR_IsHmdPresent(); } -void OpenVrDisplayPlugin::internalActivate() { +bool OpenVrDisplayPlugin::internalActivate() { Parent::internalActivate(); + _container->setIsOptionChecked(StandingHMDSensorMode, true); if (!_system) { _system = acquireOpenVrSystem(); } - Q_ASSERT(_system); + if (!_system) { + qWarning() << "Failed to initialize OpenVR"; + return false; + } _system->GetRecommendedRenderTargetSize(&_renderTargetSize.x, &_renderTargetSize.y); // Recommended render target size is per-eye, so double the X size for @@ -86,6 +90,8 @@ void OpenVrDisplayPlugin::internalActivate() { } else { qDebug() << "OpenVR: error could not get chaperone pointer"; } + + return true; } void OpenVrDisplayPlugin::internalDeactivate() { diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 78b76cb78d..022af5b06d 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -30,7 +30,7 @@ public: virtual void updateHeadPose(uint32_t frameIndex) override; protected: - void internalActivate() override; + bool internalActivate() override; void internalDeactivate() override; void hmdPresent() override; diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp index 2e2c0face0..c1ed5aa880 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -53,8 +53,9 @@ bool ViveControllerManager::isSupported() const { return !isOculusPresent() && vr::VR_IsHmdPresent(); } -void ViveControllerManager::activate() { +bool ViveControllerManager::activate() { InputPlugin::activate(); + _container->addMenu(MENU_PATH); _container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, RENDER_CONTROLLERS, [this] (bool clicked) { this->setRenderControllers(clicked); }, @@ -122,6 +123,8 @@ void ViveControllerManager::activate() { auto userInputMapper = DependencyManager::get(); userInputMapper->registerDevice(_inputDevice); _registeredWithInputMapper = true; + + return true; } void ViveControllerManager::deactivate() { diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index 480fbfeb90..d3645304c5 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -37,7 +37,7 @@ public: virtual bool isJointController() const override { return true; } const QString& getName() const override { return NAME; } - virtual void activate() override; + virtual bool activate() override; virtual void deactivate() override; virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } @@ -111,8 +111,6 @@ private: std::shared_ptr _inputDevice { std::make_shared(_system) }; static const QString NAME; - - }; #endif // hifi__ViveControllerManager From 37a725b06dc8b9bc183609a2077ec54602c939bf Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 12:12:52 -0700 Subject: [PATCH 3/6] Fallback to desktop if display plugin fails --- interface/src/Application.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9bef698167..7f2d1d2af5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4892,7 +4892,17 @@ void Application::updateDisplayMode() { // FIXME probably excessive and useless context switching _offscreenContext->makeCurrent(); - newDisplayPlugin->activate(); + + // If the new plugin fails to activate, fallback to first item on the list + if (!newDisplayPlugin->activate()) { + qWarning() << "Failed to activate plugin: " << newDisplayPlugin->getName(); + newDisplayPlugin = displayPlugins.at(0); + qWarning() << "Activating fallback plugin: " << newDisplayPlugin->getName(); + if (!newDisplayPlugin->activate()) { + qFatal("Failed to activate fallback plugin"); + } + } + _offscreenContext->makeCurrent(); offscreenUi->resize(fromGlm(newDisplayPlugin->getRecommendedUiSize())); _offscreenContext->makeCurrent(); From b94e244844c99a8acf402634a31c0d8a62b115cc Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 12:24:31 -0700 Subject: [PATCH 4/6] Update oculus legacy plugin --- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp | 6 +++++- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index 73e18aa697..396f55b932 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -68,18 +68,20 @@ bool OculusLegacyDisplayPlugin::isSupported() const { return result; } -void OculusLegacyDisplayPlugin::internalActivate() { +bool OculusLegacyDisplayPlugin::internalActivate() { Parent::internalActivate(); if (!(ovr_Initialize(nullptr))) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); + return false; } _hswDismissed = false; _hmd = ovrHmd_Create(0); if (!_hmd) { qFatal("Failed to acquire HMD"); + return false; } _ipd = ovrHmd_GetFloat(_hmd, OVR_KEY_IPD, _ipd); @@ -107,6 +109,8 @@ void OculusLegacyDisplayPlugin::internalActivate() { ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrTrackingCap_MagYawCorrection, 0)) { qFatal("Could not attach to sensor device"); } + + return true; } void OculusLegacyDisplayPlugin::internalDeactivate() { diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index bf4ae26205..187c0681e9 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -31,7 +31,7 @@ public: virtual float getTargetFrameRate() override; protected: - virtual void internalActivate() override; + virtual bool internalActivate() override; virtual void internalDeactivate() override; virtual void customizeContext() override; From 34a77b47a34a2f59d9fff4f0e4a6b78a0c3f4750 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 12:25:56 -0700 Subject: [PATCH 5/6] Restore SDL2 comments --- plugins/hifiSdl2/src/SDL2Manager.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index 5e3e16d090..f69e23ee98 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -34,7 +34,9 @@ public: virtual void init() override; virtual void deinit() override; + /// Called when a plugin is being activated for use. May be called multiple times. virtual bool activate() override; + /// Called when a plugin is no longer being used. May be called multiple times. virtual void deactivate() override; virtual void pluginFocusOutEvent() override; From 7bcef1d3194cbfd7e7dc995b067df3d2db7a1df7 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 28 Mar 2016 12:54:38 -0700 Subject: [PATCH 6/6] Fallback display to last, then desktop --- interface/src/Application.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7f2d1d2af5..7eb19557e5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4886,6 +4886,7 @@ void Application::updateDisplayMode() { { std::unique_lock lock(_displayPluginLock); + auto oldDisplayPlugin = _displayPlugin; if (_displayPlugin) { _displayPlugin->deactivate(); } @@ -4893,12 +4894,27 @@ void Application::updateDisplayMode() { // FIXME probably excessive and useless context switching _offscreenContext->makeCurrent(); - // If the new plugin fails to activate, fallback to first item on the list - if (!newDisplayPlugin->activate()) { - qWarning() << "Failed to activate plugin: " << newDisplayPlugin->getName(); - newDisplayPlugin = displayPlugins.at(0); - qWarning() << "Activating fallback plugin: " << newDisplayPlugin->getName(); - if (!newDisplayPlugin->activate()) { + bool active = newDisplayPlugin->activate(); + + if (!active) { + // If the new plugin fails to activate, fallback to last display + qWarning() << "Failed to activate display: " << newDisplayPlugin->getName(); + newDisplayPlugin = oldDisplayPlugin; + + if (newDisplayPlugin) { + qWarning() << "Falling back to last display: " << newDisplayPlugin->getName(); + active = newDisplayPlugin->activate(); + } + + // If there is no last display, or + // If the last display fails to activate, fallback to desktop + if (!active) { + newDisplayPlugin = displayPlugins.at(0); + qWarning() << "Falling back to display: " << newDisplayPlugin->getName(); + active = newDisplayPlugin->activate(); + } + + if (!active) { qFatal("Failed to activate fallback plugin"); } }