From b4c75c3f877bed841c53cedaacd1564919857468 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 19 Jun 2017 14:41:42 -0700 Subject: [PATCH] working, except tablet issue --- .../resources/qml/hifi/SpectatorCamera.qml | 14 +++++------- interface/src/ui/ResourceImageItem.cpp | 17 ++++---------- .../display-plugins/OpenGLDisplayPlugin.cpp | 22 +++++++++---------- .../src/display-plugins/OpenGLDisplayPlugin.h | 2 +- libraries/plugins/src/plugins/DisplayPlugin.h | 6 +++-- 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/interface/resources/qml/hifi/SpectatorCamera.qml b/interface/resources/qml/hifi/SpectatorCamera.qml index 7058c49fe6..c376a653e6 100644 --- a/interface/resources/qml/hifi/SpectatorCamera.qml +++ b/interface/resources/qml/hifi/SpectatorCamera.qml @@ -190,25 +190,21 @@ Rectangle { boxSize: 24; onClicked: { sendToScript({method: (checked ? 'spectatorCameraOn' : 'spectatorCameraOff')}); - spectatorCameraPreviewItem.ready = checked; + spectatorCameraPreview.ready = checked; } } // Spectator Camera Preview - Rectangle { + Hifi.ResourceImageItem { id: spectatorCameraPreview; + url: "resource://spectatorCameraFrame"; + ready: false; + mirrorVertically: true; height: 250; anchors.left: parent.left; anchors.top: cameraToggleCheckBox.bottom; anchors.topMargin: 20; anchors.right: parent.right; - Hifi.ResourceImageItem { - id: spectatorCameraPreviewItem; - anchors.fill: parent; - url: "resource://spectatorCameraFrame"; - ready: false; - mirrorVertically: true; - } } // "Monitor Shows" Switch Label Glyph diff --git a/interface/src/ui/ResourceImageItem.cpp b/interface/src/ui/ResourceImageItem.cpp index bf51d703b2..6a5f4a431c 100644 --- a/interface/src/ui/ResourceImageItem.cpp +++ b/interface/src/ui/ResourceImageItem.cpp @@ -54,24 +54,15 @@ void ResourceImageItemRenderer::synchronize(QQuickFramebufferObject* item) { readyChanged = true; } - if (!_ready && readyChanged) { - qDebug() << "clearing network texture!!!!!!!!!!!!!!!!!"; - _networkTexture.clear(); - } - _window = resourceImageItem->window(); if (_ready && !_url.isNull() && !_url.isEmpty() && (urlChanged || readyChanged || !_networkTexture)) { _networkTexture = DependencyManager::get()->getTexture(_url); } - if (_networkTexture && _networkTexture->isLoaded()) { - qDebug() << "copying texture"; - auto texture = _networkTexture->getGPUTexture(); - if (texture) { - if (_fboMutex.tryLock()) { - qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(texture, framebufferObject()); - _fboMutex.unlock(); - } + if (_ready && _networkTexture && _networkTexture->isLoaded()) { + if(_fboMutex.tryLock()) { + qApp->getActiveDisplayPlugin()->copyTextureToQuickFramebuffer(_networkTexture, framebufferObject()); + _fboMutex.unlock(); } } } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index b044477c1f..6050211eba 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -42,7 +42,7 @@ #include #include #include - +#include #include "CompositorHelper.h" #include "Logging.h" @@ -823,33 +823,31 @@ void OpenGLDisplayPlugin::updateCompositeFramebuffer() { } } -void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) { +void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer networkTexture, QOpenGLFramebufferObject* target) { auto glBackend = const_cast(*this).getGLBackend(); withMainThreadContext([&] { - qDebug() << "initial gl error:" << glGetError(); - GLuint sourceTexture = glBackend->getTextureID(source); + GLuint sourceTexture = glBackend->getTextureID(networkTexture->getGPUTexture()); GLuint targetTexture = target->texture(); GLuint fbo[2] {0, 0}; + // need mipmaps for blitting texture glGenerateTextureMipmap(sourceTexture); - qDebug() << "errors: " << glGetError(); + // create 2 fbos (one for initial texture, second for scaled one) glCreateFramebuffers(2, fbo); + + // setup source fbo glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); - qDebug() << "errors: " << glGetError(); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture, 0); - qDebug() << "errors: " << glGetError(); + // setup destination fbo glBindFramebuffer(GL_FRAMEBUFFER, fbo[1]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0); - qDebug() << "errors: " << glGetError(); - glBlitNamedFramebuffer(fbo[0], fbo[1], 0, 0, source->getWidth(), source->getHeight(), 0, 0, target->width(), target->height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); - qDebug() << "errors: " << glGetError() << "bound?" << target->isBound(); + glBlitNamedFramebuffer(fbo[0], fbo[1], 0, 0, networkTexture->getWidth(), networkTexture->getHeight(), 0, 0, target->width(), target->height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); + // don't delete the textures! glDeleteFramebuffers(2, fbo); - glDeleteTextures(1, fbo); glFinish(); }); } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 58a1157969..d9e810bf97 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -79,7 +79,7 @@ public: // Three threads, one for rendering, one for texture transfers, one reserved for the GL driver int getRequiredThreadCount() const override { return 3; } - void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) override; + void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target); protected: friend class PresentThread; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index d45320ec9a..e9b31b5c35 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -22,7 +22,6 @@ #include #include #include - #include "Plugin.h" class QOpenGLFramebufferObject; @@ -62,6 +61,9 @@ namespace gpu { using TexturePointer = std::shared_ptr; } +class NetworkTexture; +using NetworkTexturePointer = QSharedPointer; + // Stereo display functionality // TODO move out of this file don't derive DisplayPlugin from this. Instead use dynamic casting when // displayPlugin->isStereo returns true @@ -210,7 +212,7 @@ public: // Hardware specific stats virtual QJsonObject getHardwareStats() const { return QJsonObject(); } - virtual void copyTextureToQuickFramebuffer(gpu::TexturePointer source, QOpenGLFramebufferObject* target) = 0; + virtual void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target) = 0; uint32_t presentCount() const { return _presentedFrameIndex; } // Time since last call to incrementPresentCount (only valid if DEBUG_PAINT_DELAY is defined)