From 3509a797a16d798a3a296e3e4f49b49f2acf9432 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 9 Sep 2019 11:33:05 -0700 Subject: [PATCH 1/2] Avoiding to rely on the display plugin resource in the getHUDOperator to avoid a case of unallocated resource --- .../display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 1d0fc5a128..fe4bf30602 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -586,7 +586,7 @@ void OpenGLDisplayPlugin::updateFrameData() { std::function OpenGLDisplayPlugin::getHUDOperator() { auto hudPipeline = _hudPipeline; auto hudStereo = isStereo(); - auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize(); + auto hudCompositeFramebufferSize = getRecommendedRenderSize(); std::array hudEyeViewports; for_each_eye([&](Eye eye) { hudEyeViewports[eye] = eyeViewport(eye); From 3c34443f24d346f55174582d6a691dfba1990265 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 9 Sep 2019 13:43:32 -0700 Subject: [PATCH 2/2] where possible (in OpenGLDisplayPLugin) remove the need for the eye specific function and keep it in the HMD display plugin for the case of the POinter drawcall --- .../display-plugins/OpenGLDisplayPlugin.cpp | 41 +++---------------- .../src/display-plugins/OpenGLDisplayPlugin.h | 1 - .../display-plugins/hmd/HmdDisplayPlugin.cpp | 10 +++++ .../display-plugins/hmd/HmdDisplayPlugin.h | 2 + 4 files changed, 17 insertions(+), 37 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index fe4bf30602..74d36101db 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -585,26 +585,13 @@ void OpenGLDisplayPlugin::updateFrameData() { std::function OpenGLDisplayPlugin::getHUDOperator() { auto hudPipeline = _hudPipeline; - auto hudStereo = isStereo(); auto hudCompositeFramebufferSize = getRecommendedRenderSize(); - std::array hudEyeViewports; - for_each_eye([&](Eye eye) { - hudEyeViewports[eye] = eyeViewport(eye); - }); return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture) { if (hudPipeline && hudTexture) { - batch.enableStereo(false); batch.setPipeline(hudPipeline); batch.setResourceTexture(0, hudTexture); - if (hudStereo) { - for_each_eye([&](Eye eye) { - batch.setViewportTransform(hudEyeViewports[eye]); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - } else { - batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize)); - batch.draw(gpu::TRIANGLE_STRIP, 4); - } + batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize)); + batch.draw(gpu::TRIANGLE_STRIP, 4); } }; } @@ -614,22 +601,14 @@ void OpenGLDisplayPlugin::compositePointer() { const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()]; auto cursorTransform = DependencyManager::get()->getReticleTransform(glm::mat4()); render([&](gpu::Batch& batch) { - batch.enableStereo(false); batch.setProjectionTransform(mat4()); batch.setFramebuffer(_compositeFramebuffer); batch.setPipeline(_cursorPipeline); batch.setResourceTexture(0, cursorData.texture); batch.resetViewTransform(); batch.setModelTransform(cursorTransform); - if (isStereo()) { - for_each_eye([&](Eye eye) { - batch.setViewportTransform(eyeViewport(eye)); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - } else { - batch.setViewportTransform(ivec4(uvec2(0), _compositeFramebuffer->getSize())); - batch.draw(gpu::TRIANGLE_STRIP, 4); - } + batch.setViewportTransform(ivec4(uvec2(0), _compositeFramebuffer->getSize())); + batch.draw(gpu::TRIANGLE_STRIP, 4); }); } @@ -871,16 +850,6 @@ bool OpenGLDisplayPlugin::beginFrameRender(uint32_t frameIndex) { return Parent::beginFrameRender(frameIndex); } -ivec4 OpenGLDisplayPlugin::eyeViewport(Eye eye) const { - uvec2 vpSize = _compositeFramebuffer->getSize(); - vpSize.x /= 2; - uvec2 vpPos; - if (eye == Eye::Right) { - vpPos.x = vpSize.x; - } - return ivec4(vpPos, vpSize); -} - gpu::gl::GLBackend* OpenGLDisplayPlugin::getGLBackend() { if (!_gpuContext || !_gpuContext->getBackend()) { return nullptr; @@ -906,7 +875,7 @@ OpenGLDisplayPlugin::~OpenGLDisplayPlugin() { } void OpenGLDisplayPlugin::updateCompositeFramebuffer() { - auto renderSize = glm::uvec2(getRecommendedRenderSize()); + auto renderSize = getRecommendedRenderSize(); if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) { _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_SRGBA_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 a8d7847c09..15cebf7e3a 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -137,7 +137,6 @@ protected: void present(const std::shared_ptr& refreshRateController); virtual void swapBuffers(); - ivec4 eyeViewport(Eye eye) const; void render(std::function f); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 24c16c1493..722ab341f7 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -68,6 +68,16 @@ glm::mat4 HmdDisplayPlugin::getCullingProjection(const glm::mat4& baseProjection return _cullingProjection; } +glm::ivec4 HmdDisplayPlugin::eyeViewport(Eye eye) const { + uvec2 vpSize = getRecommendedRenderSize(); + vpSize.x /= 2; + uvec2 vpPos; + if (eye == Eye::Right) { + vpPos.x = vpSize.x; + } + return ivec4(vpPos, vpSize); +} + #define DISABLE_PREVIEW_MENU_ITEM_DELAY_MS 500 bool HmdDisplayPlugin::internalActivate() { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 36810681ad..d34a70f722 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -34,6 +34,8 @@ public: glm::uvec2 getRecommendedRenderSize() const override final { return _renderTargetSize; } bool isDisplayVisible() const override { return isHmdMounted(); } + ivec4 eyeViewport(Eye eye) const; + QRect getRecommendedHUDRect() const override final; virtual glm::mat4 getHeadPose() const override;