From 335ed667bb1958e6f310cfeb64bcd3156d60978b Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 29 Jun 2016 16:05:17 -0700 Subject: [PATCH 1/3] dk2 snapshot takes picture of HMD window --- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 14 ++++++++++++++ .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index f1aa1edc81..38fb86dc28 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -38,6 +38,20 @@ QRect HmdDisplayPlugin::getRecommendedOverlayRect() const { return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT; } +QImage HmdDisplayPlugin::getScreenshot() const { + using namespace oglplus; + QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); + auto windowSize = toGlm(_container->getPrimaryWidget()->size()); + _compositeFramebuffer->Bound(Framebuffer::Target::Read, [&] { + Context::BlitFramebuffer( + 0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, + 0, 0, windowSize.x, windowSize.y, + BufferSelectBit::ColorBuffer, BlitFilter::Nearest); + Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); + }); + return screenshot.mirrored(false, true); +} + bool HmdDisplayPlugin::internalActivate() { _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index fada15d864..9a8d89a2c8 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -27,6 +27,8 @@ public: void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; bool isDisplayVisible() const override { return isHmdMounted(); } + QImage getScreenshot() const override; + QRect getRecommendedOverlayRect() const override final; virtual glm::mat4 getHeadPose() const override; From 40d584021a47e2c0d1960f13a07ac98115263cf1 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 29 Jun 2016 18:09:46 -0700 Subject: [PATCH 2/3] replace old code completely, removed unnecessary blit --- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 10 ++++++---- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 14 -------------- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 -- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index b72f52351f..8650c086e3 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -647,12 +647,14 @@ void OpenGLDisplayPlugin::withMainThreadContext(std::function f) const { } QImage OpenGLDisplayPlugin::getScreenshot() const { - QImage result; + using namespace oglplus; + QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); withMainThreadContext([&] { - static auto widget = _container->getPrimaryWidget(); - result = widget->grabFrameBuffer(); + auto windowSize = toGlm(_container->getPrimaryWidget()->size()); + Framebuffer::Bind(Framebuffer::Target::Read, _compositeFramebuffer->fbo); + Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); }); - return result; + return screenshot.mirrored(false, true); } uint32_t OpenGLDisplayPlugin::getSceneTextureId() const { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 38fb86dc28..f1aa1edc81 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -38,20 +38,6 @@ QRect HmdDisplayPlugin::getRecommendedOverlayRect() const { return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT; } -QImage HmdDisplayPlugin::getScreenshot() const { - using namespace oglplus; - QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); - auto windowSize = toGlm(_container->getPrimaryWidget()->size()); - _compositeFramebuffer->Bound(Framebuffer::Target::Read, [&] { - Context::BlitFramebuffer( - 0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, - 0, 0, windowSize.x, windowSize.y, - BufferSelectBit::ColorBuffer, BlitFilter::Nearest); - Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); - }); - return screenshot.mirrored(false, true); -} - bool HmdDisplayPlugin::internalActivate() { _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 9a8d89a2c8..fada15d864 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -27,8 +27,6 @@ public: void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; bool isDisplayVisible() const override { return isHmdMounted(); } - QImage getScreenshot() const override; - QRect getRecommendedOverlayRect() const override final; virtual glm::mat4 getHeadPose() const override; From be102ba9265a8915ec947414bae05fb43933704f Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 30 Jun 2016 10:05:57 -0700 Subject: [PATCH 3/3] remove unused variable --- .../display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 8650c086e3..18f39cd3df 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -650,7 +650,6 @@ QImage OpenGLDisplayPlugin::getScreenshot() const { using namespace oglplus; QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); withMainThreadContext([&] { - auto windowSize = toGlm(_container->getPrimaryWidget()->size()); Framebuffer::Bind(Framebuffer::Target::Read, _compositeFramebuffer->fbo); Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); });