From d4e83a7461f1bcb10084b3411fdc13838798e999 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 12 Oct 2016 23:57:42 -0700 Subject: [PATCH 1/3] Don't crash on OpenVR activation when SteamVR isn't running --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 50443ce73c..b9a491a8a2 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -377,9 +377,6 @@ void OpenVrDisplayPlugin::init() { } bool OpenVrDisplayPlugin::internalActivate() { - _openVrDisplayActive = true; - _container->setIsOptionChecked(StandingHMDSensorMode, true); - if (!_system) { _system = acquireOpenVrSystem(); } @@ -388,6 +385,18 @@ bool OpenVrDisplayPlugin::internalActivate() { return false; } + // If OpenVR isn't running, then the compositor won't be accessible + // FIXME find a way to launch the compositor? + if (!vr::VRCompositor()) { + qWarning() << "Failed to acquire OpenVR compositor"; + releaseOpenVrSystem(); + _system = nullptr; + return false; + } + + _openVrDisplayActive = true; + _container->setIsOptionChecked(StandingHMDSensorMode, true); + _system->GetRecommendedRenderTargetSize(&_renderTargetSize.x, &_renderTargetSize.y); // Recommended render target size is per-eye, so double the X size for // left + right eyes From 46326ed27c234f6a3693c888cccb0a0e83f91d46 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 13 Oct 2016 16:46:02 -0700 Subject: [PATCH 2/3] Fix crash in switching to plugin that uses the composite framebuffer in customizeContext --- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 13 +++++++++---- .../src/display-plugins/OpenGLDisplayPlugin.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 02e5a064f5..a92f36ed71 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -414,6 +414,7 @@ void OpenGLDisplayPlugin::customizeContext() { _cursorPipeline = gpu::Pipeline::create(program, state); } } + updateCompositeFramebuffer(); } void OpenGLDisplayPlugin::uncustomizeContext() { @@ -557,10 +558,7 @@ void OpenGLDisplayPlugin::compositeScene() { } void OpenGLDisplayPlugin::compositeLayers() { - auto renderSize = getRecommendedRenderSize(); - if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) { - _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("displayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y)); - } + updateCompositeFramebuffer(); { PROFILE_RANGE_EX("compositeScene", 0xff0077ff, (uint64_t)presentCount()) @@ -760,3 +758,10 @@ void OpenGLDisplayPlugin::render(std::function f) { OpenGLDisplayPlugin::~OpenGLDisplayPlugin() { qDebug() << "Destroying OpenGLDisplayPlugin"; } + +void OpenGLDisplayPlugin::updateCompositeFramebuffer() { + auto renderSize = getRecommendedRenderSize(); + if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) { + _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y)); + } +} diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 9369f6d72c..a6de3f7baa 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -78,6 +78,8 @@ protected: glm::uvec2 getSurfaceSize() const; glm::uvec2 getSurfacePixels() const; + void updateCompositeFramebuffer(); + virtual void compositeLayers(); virtual void compositeScene(); virtual void compositeOverlay(); From ff3d1b3d0139d9af70efd797bd55439a5af153a5 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 13 Oct 2016 16:53:37 -0700 Subject: [PATCH 3/3] Don't use VR compositor if it doesn't exist --- plugins/openvr/src/OpenVrHelpers.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index ccf318a629..13880af89f 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -109,8 +109,12 @@ void releaseOpenVrSystem() { vr::Texture_t vrTexture{ (void*)INVALID_GL_TEXTURE_HANDLE, vr::API_OpenGL, vr::ColorSpace_Auto }; static vr::VRTextureBounds_t OPENVR_TEXTURE_BOUNDS_LEFT{ 0, 0, 0.5f, 1 }; static vr::VRTextureBounds_t OPENVR_TEXTURE_BOUNDS_RIGHT{ 0.5f, 0, 1, 1 }; - vr::VRCompositor()->Submit(vr::Eye_Left, &vrTexture, &OPENVR_TEXTURE_BOUNDS_LEFT); - vr::VRCompositor()->Submit(vr::Eye_Right, &vrTexture, &OPENVR_TEXTURE_BOUNDS_RIGHT); + + auto compositor = vr::VRCompositor(); + if (compositor) { + compositor->Submit(vr::Eye_Left, &vrTexture, &OPENVR_TEXTURE_BOUNDS_LEFT); + compositor->Submit(vr::Eye_Right, &vrTexture, &OPENVR_TEXTURE_BOUNDS_RIGHT); + } vr::VR_Shutdown(); _openVrQuitRequested = false;